@fazzcode/baileys 0.1.6 → 2.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.
- package/LICENSE +21 -0
- package/WAProto/WAProto.proto +5311 -0
- package/WAProto/index.js +83385 -119575
- package/lib/Defaults/index.js +117 -124
- package/lib/KeyDB/BinarySearch.js +20 -0
- package/lib/KeyDB/KeyedDB.js +167 -0
- package/lib/KeyDB/index.js +4 -0
- package/lib/Signal/Group/ciphertext-message.js +12 -14
- package/lib/Signal/Group/group-session-builder.js +10 -42
- package/lib/Signal/Group/group_cipher.js +75 -87
- package/lib/Signal/Group/index.js +13 -57
- package/lib/Signal/Group/keyhelper.js +17 -52
- package/lib/Signal/Group/sender-chain-key.js +27 -33
- package/lib/Signal/Group/sender-key-distribution-message.js +62 -63
- package/lib/Signal/Group/sender-key-message.js +65 -66
- package/lib/Signal/Group/sender-key-name.js +45 -44
- package/lib/Signal/Group/sender-key-record.js +39 -49
- package/lib/Signal/Group/sender-key-state.js +80 -93
- package/lib/Signal/Group/sender-message-key.js +27 -28
- package/lib/Signal/libsignal.js +313 -163
- package/lib/Signal/lid-mapping.js +155 -0
- package/lib/Socket/Client/index.js +4 -19
- package/lib/Socket/Client/types.js +13 -0
- package/lib/Socket/Client/websocket.js +52 -0
- package/lib/Socket/business.js +359 -242
- package/lib/Socket/chats.js +851 -830
- package/lib/Socket/communities.js +413 -0
- package/lib/Socket/groups.js +304 -309
- package/lib/Socket/index.js +15 -9
- package/lib/Socket/messages-recv.js +1107 -1054
- package/lib/Socket/messages-send.js +709 -414
- package/lib/Socket/mex.js +45 -0
- package/lib/Socket/newsletter.js +232 -318
- package/lib/Socket/socket.js +789 -599
- package/lib/Store/index.js +6 -10
- package/lib/Store/make-cache-manager-store.js +73 -81
- package/lib/Store/make-in-memory-store.js +286 -423
- package/lib/Store/make-ordered-dictionary.js +77 -79
- package/lib/Store/object-repository.js +24 -26
- package/lib/Types/Auth.js +3 -2
- package/lib/Types/Bussines.js +3 -0
- package/lib/Types/Call.js +3 -2
- package/lib/Types/Chat.js +9 -4
- package/lib/Types/Contact.js +3 -2
- package/lib/Types/Events.js +3 -2
- package/lib/Types/GroupMetadata.js +3 -2
- package/lib/Types/Label.js +24 -26
- package/lib/Types/LabelAssociation.js +6 -8
- package/lib/Types/Message.js +12 -9
- package/lib/Types/Newsletter.js +31 -30
- package/lib/Types/Newsletter.js.bak +33 -0
- package/lib/Types/Product.js +3 -2
- package/lib/Types/Signal.js +3 -2
- package/lib/Types/Socket.js +4 -2
- package/lib/Types/State.js +11 -2
- package/lib/Types/USync.js +3 -2
- package/lib/Types/index.js +27 -41
- package/lib/Utils/auth-utils.js +211 -198
- package/lib/Utils/baileys-event-stream.js +42 -61
- package/lib/Utils/browser-utils.js +25 -0
- package/lib/Utils/business.js +213 -214
- package/lib/Utils/chat-utils.js +710 -687
- package/lib/Utils/crypto.js +112 -133
- package/lib/Utils/decode-wa-message.js +252 -183
- package/lib/Utils/event-buffer.js +510 -496
- package/lib/Utils/generics.js +328 -356
- package/lib/Utils/history.js +83 -92
- package/lib/Utils/index.js +21 -33
- package/lib/Utils/link-preview.js +71 -83
- package/lib/Utils/logger.js +5 -7
- package/lib/Utils/lt-hash.js +40 -46
- package/lib/Utils/make-mutex.js +34 -41
- package/lib/Utils/message-retry-manager.js +113 -0
- package/lib/Utils/messages-media.js +548 -678
- package/lib/Utils/messages.js +352 -249
- package/lib/Utils/noise-handler.js +138 -149
- package/lib/Utils/pre-key-manager.js +85 -0
- package/lib/Utils/process-message.js +323 -303
- package/lib/Utils/signal.js +148 -138
- package/lib/Utils/use-multi-file-auth-state.js +98 -67
- package/lib/Utils/validate-connection.js +183 -188
- package/lib/WABinary/constants.js +1298 -35
- package/lib/WABinary/decode.js +237 -249
- package/lib/WABinary/encode.js +208 -218
- package/lib/WABinary/generic-utils.js +53 -57
- package/lib/WABinary/index.js +7 -21
- package/lib/WABinary/jid-utils.js +89 -58
- package/lib/WABinary/types.js +3 -2
- package/lib/WAM/BinaryInfo.js +10 -12
- package/lib/WAM/constants.js +22851 -15348
- package/lib/WAM/encode.js +135 -136
- package/lib/WAM/index.js +5 -19
- package/lib/WAUSync/Protocols/USyncContactProtocol.js +28 -30
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +49 -53
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +27 -28
- package/lib/WAUSync/Protocols/USyncStatusProtocol.js +36 -39
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +50 -50
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +26 -20
- package/lib/WAUSync/Protocols/index.js +6 -20
- package/lib/WAUSync/USyncQuery.js +86 -85
- package/lib/WAUSync/USyncUser.js +23 -25
- package/lib/WAUSync/index.js +5 -19
- package/lib/index.js +32 -34
- package/package.json +99 -105
- package/README.MD +0 -121
- package/engine-requirements.js +0 -10
- package/lib/Defaults/baileys-version.json +0 -3
- package/lib/Defaults/index.d.ts +0 -53
- package/lib/Defaults/phonenumber-mcc.json +0 -223
- package/lib/Signal/Group/ciphertext-message.d.ts +0 -9
- package/lib/Signal/Group/group-session-builder.d.ts +0 -14
- package/lib/Signal/Group/group_cipher.d.ts +0 -17
- package/lib/Signal/Group/index.d.ts +0 -11
- package/lib/Signal/Group/keyhelper.d.ts +0 -10
- package/lib/Signal/Group/queue-job.d.ts +0 -1
- package/lib/Signal/Group/queue-job.js +0 -57
- package/lib/Signal/Group/sender-chain-key.d.ts +0 -13
- package/lib/Signal/Group/sender-key-distribution-message.d.ts +0 -16
- package/lib/Signal/Group/sender-key-message.d.ts +0 -18
- package/lib/Signal/Group/sender-key-name.d.ts +0 -17
- package/lib/Signal/Group/sender-key-record.d.ts +0 -30
- package/lib/Signal/Group/sender-key-state.d.ts +0 -38
- package/lib/Signal/Group/sender-message-key.d.ts +0 -11
- package/lib/Signal/libsignal.d.ts +0 -3
- package/lib/Socket/Client/abstract-socket-client.d.ts +0 -17
- package/lib/Socket/Client/abstract-socket-client.js +0 -13
- package/lib/Socket/Client/index.d.ts +0 -3
- package/lib/Socket/Client/mobile-socket-client.d.ts +0 -13
- package/lib/Socket/Client/mobile-socket-client.js +0 -65
- package/lib/Socket/Client/web-socket-client.d.ts +0 -12
- package/lib/Socket/Client/web-socket-client.js +0 -62
- package/lib/Socket/business.d.ts +0 -171
- package/lib/Socket/chats.d.ts +0 -80
- package/lib/Socket/dugong.d.ts +0 -219
- package/lib/Socket/dugong.js +0 -441
- package/lib/Socket/groups.d.ts +0 -115
- package/lib/Socket/index.d.ts +0 -173
- package/lib/Socket/messages-recv.d.ts +0 -161
- package/lib/Socket/messages-send.d.ts +0 -149
- package/lib/Socket/newsletter.d.ts +0 -134
- package/lib/Socket/registration.d.ts +0 -267
- package/lib/Socket/registration.js +0 -166
- package/lib/Socket/socket.d.ts +0 -43
- package/lib/Socket/usync.d.ts +0 -36
- package/lib/Socket/usync.js +0 -70
- package/lib/Store/index.d.ts +0 -3
- package/lib/Store/make-cache-manager-store.d.ts +0 -13
- package/lib/Store/make-in-memory-store.d.ts +0 -118
- package/lib/Store/make-ordered-dictionary.d.ts +0 -13
- package/lib/Store/object-repository.d.ts +0 -10
- package/lib/Types/Auth.d.ts +0 -110
- package/lib/Types/Call.d.ts +0 -13
- package/lib/Types/Chat.d.ts +0 -102
- package/lib/Types/Contact.d.ts +0 -19
- package/lib/Types/Events.d.ts +0 -157
- package/lib/Types/GroupMetadata.d.ts +0 -55
- package/lib/Types/Label.d.ts +0 -35
- package/lib/Types/LabelAssociation.d.ts +0 -29
- package/lib/Types/Message.d.ts +0 -273
- package/lib/Types/Newsletter.d.ts +0 -92
- package/lib/Types/Product.d.ts +0 -78
- package/lib/Types/Signal.d.ts +0 -57
- package/lib/Types/Socket.d.ts +0 -111
- package/lib/Types/State.d.ts +0 -27
- package/lib/Types/USync.d.ts +0 -25
- package/lib/Types/index.d.ts +0 -57
- package/lib/Utils/auth-utils.d.ts +0 -18
- package/lib/Utils/baileys-event-stream.d.ts +0 -16
- package/lib/Utils/business.d.ts +0 -22
- package/lib/Utils/chat-utils.d.ts +0 -71
- package/lib/Utils/crypto.d.ts +0 -41
- package/lib/Utils/decode-wa-message.d.ts +0 -19
- package/lib/Utils/event-buffer.d.ts +0 -35
- package/lib/Utils/generics.d.ts +0 -92
- package/lib/Utils/history.d.ts +0 -15
- package/lib/Utils/index.d.ts +0 -17
- package/lib/Utils/link-preview.d.ts +0 -21
- package/lib/Utils/logger.d.ts +0 -4
- package/lib/Utils/lt-hash.d.ts +0 -12
- package/lib/Utils/make-mutex.d.ts +0 -7
- package/lib/Utils/messages-media.d.ts +0 -116
- package/lib/Utils/messages.d.ts +0 -77
- package/lib/Utils/noise-handler.d.ts +0 -21
- package/lib/Utils/process-message.d.ts +0 -41
- package/lib/Utils/signal.d.ts +0 -32
- package/lib/Utils/use-multi-file-auth-state.d.ts +0 -13
- package/lib/Utils/validate-connection.d.ts +0 -11
- package/lib/WABinary/constants.d.ts +0 -27
- package/lib/WABinary/decode.d.ts +0 -7
- package/lib/WABinary/encode.d.ts +0 -3
- package/lib/WABinary/generic-utils.d.ts +0 -16
- package/lib/WABinary/index.d.ts +0 -5
- package/lib/WABinary/jid-utils.d.ts +0 -31
- package/lib/WABinary/types.d.ts +0 -18
- package/lib/WAM/BinaryInfo.d.ts +0 -17
- package/lib/WAM/constants.d.ts +0 -38
- package/lib/WAM/encode.d.ts +0 -3
- package/lib/WAM/index.d.ts +0 -3
- package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +0 -9
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +0 -22
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +0 -12
- package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +0 -12
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +0 -25
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +0 -8
- package/lib/WAUSync/Protocols/index.d.ts +0 -4
- package/lib/WAUSync/USyncQuery.d.ts +0 -28
- package/lib/WAUSync/USyncUser.d.ts +0 -12
- package/lib/WAUSync/index.d.ts +0 -3
- package/lib/index.d.ts +0 -12
package/lib/Utils/generics.js
CHANGED
|
@@ -1,391 +1,363 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
};
|
|
36
|
-
exports.getPlatformId = getPlatformId;
|
|
37
|
-
exports.BufferJSON = {
|
|
38
|
-
replacer: (k, value) => {
|
|
39
|
-
if (Buffer.isBuffer(value) || value instanceof Uint8Array || (value === null || value === void 0 ? void 0 : value.type) === 'Buffer') {
|
|
40
|
-
return { type: 'Buffer', data: Buffer.from((value === null || value === void 0 ? void 0 : value.data) || value).toString('base64') };
|
|
41
|
-
}
|
|
42
|
-
return value;
|
|
43
|
-
},
|
|
44
|
-
reviver: (_, value) => {
|
|
45
|
-
if (typeof value === 'object' && !!value && (value.buffer === true || value.type === 'Buffer')) {
|
|
46
|
-
const val = value.data || value.value;
|
|
47
|
-
return typeof val === 'string' ? Buffer.from(val, 'base64') : Buffer.from(val || []);
|
|
1
|
+
//=======================================================//
|
|
2
|
+
import { getAllBinaryNodeChildren, jidDecode } from "../WABinary/index.js";
|
|
3
|
+
import { DisconnectReason } from "../Types/index.js";
|
|
4
|
+
import { createHash, randomBytes } from "crypto";
|
|
5
|
+
import { proto } from "../../WAProto/index.js";
|
|
6
|
+
import { version } from "../Defaults/index.js"
|
|
7
|
+
import { sha256 } from "./crypto.js";
|
|
8
|
+
import { Boom } from "@hapi/boom";
|
|
9
|
+
import axios from 'axios';
|
|
10
|
+
//=======================================================//
|
|
11
|
+
export const tiktokdl = async (url) => {
|
|
12
|
+
const encodedUrl = encodeURIComponent(url);
|
|
13
|
+
const apiUrl = `https://api.ziaul.my.id/api/downloader/tiktok?url=${encodedUrl}`;
|
|
14
|
+
const response = await axios.get(apiUrl);
|
|
15
|
+
return response.data.data;
|
|
16
|
+
}
|
|
17
|
+
//=======================================================//
|
|
18
|
+
export const BufferJSON = {
|
|
19
|
+
replacer: (k, value) => {
|
|
20
|
+
if (Buffer.isBuffer(value) || value instanceof Uint8Array || value?.type === "Buffer") {
|
|
21
|
+
return { type: "Buffer", data: Buffer.from(value?.data || value).toString("base64") };
|
|
22
|
+
}
|
|
23
|
+
return value;
|
|
24
|
+
},
|
|
25
|
+
reviver: (_, value) => {
|
|
26
|
+
if (typeof value === "object" && value !== null && value.type === "Buffer" && typeof value.data === "string") {
|
|
27
|
+
return Buffer.from(value.data, "base64");
|
|
28
|
+
}
|
|
29
|
+
if (typeof value === "object" && value !== null && !Array.isArray(value)) {
|
|
30
|
+
const keys = Object.keys(value);
|
|
31
|
+
if (keys.length > 0 && keys.every(k => !isNaN(parseInt(k, 10)))) {
|
|
32
|
+
const values = Object.values(value);
|
|
33
|
+
if (values.every(v => typeof v === "number")) {
|
|
34
|
+
return Buffer.from(values);
|
|
48
35
|
}
|
|
49
|
-
|
|
36
|
+
}
|
|
50
37
|
}
|
|
38
|
+
return value;
|
|
39
|
+
}
|
|
51
40
|
};
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
const writeRandomPadMax16 = (msg) => {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
pad[0] = 0xf;
|
|
59
|
-
}
|
|
60
|
-
return Buffer.concat([msg, Buffer.alloc(pad[0], pad[0])]);
|
|
41
|
+
//=======================================================//
|
|
42
|
+
export const getKeyAuthor = (key, meId = "me") => (key?.fromMe ? meId : key?.participant || key?.remoteJid) || "";
|
|
43
|
+
export const writeRandomPadMax16 = (msg) => {
|
|
44
|
+
const pad = randomBytes(1);
|
|
45
|
+
const padLength = (pad[0] & 0x0f) + 1;
|
|
46
|
+
return Buffer.concat([msg, Buffer.alloc(padLength, padLength)]);
|
|
61
47
|
};
|
|
62
|
-
|
|
63
|
-
const unpadRandomMax16 = (e) => {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
48
|
+
//=======================================================//
|
|
49
|
+
export const unpadRandomMax16 = (e) => {
|
|
50
|
+
const t = new Uint8Array(e);
|
|
51
|
+
if (0 === t.length) {
|
|
52
|
+
throw new Error("unpadPkcs7 given empty bytes");
|
|
53
|
+
}
|
|
54
|
+
var r = t[t.length - 1];
|
|
55
|
+
if (r > t.length) {
|
|
56
|
+
throw new Error(`unpad given ${t.length} bytes, but pad is ${r}`);
|
|
57
|
+
}
|
|
58
|
+
return new Uint8Array(t.buffer, t.byteOffset, t.length - r);
|
|
73
59
|
};
|
|
74
|
-
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
const
|
|
78
|
-
|
|
60
|
+
//=======================================================//
|
|
61
|
+
export const generateParticipantHashV2 = (participants) => {
|
|
62
|
+
participants.sort();
|
|
63
|
+
const sha256Hash = sha256(Buffer.from(participants.join(""))).toString("base64");
|
|
64
|
+
return "2:" + sha256Hash.slice(0, 6);
|
|
79
65
|
};
|
|
80
|
-
|
|
81
|
-
const
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
for (let i = t - 1; i >= 0; i--) {
|
|
85
|
-
a[i] = 255 & r;
|
|
86
|
-
r >>>= 8;
|
|
87
|
-
}
|
|
88
|
-
return a;
|
|
66
|
+
//=======================================================//
|
|
67
|
+
export const encodeWAMessage = (message) => writeRandomPadMax16(proto.Message.encode(message).finish());
|
|
68
|
+
export const generateRegistrationId = () => {
|
|
69
|
+
return Uint16Array.from(randomBytes(2))[0] & 16383;
|
|
89
70
|
};
|
|
90
|
-
|
|
91
|
-
const
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
start: (newIntervalMs, newTask) => {
|
|
100
|
-
task = newTask || task;
|
|
101
|
-
intervalMs = newIntervalMs || intervalMs;
|
|
102
|
-
timeout && clearTimeout(timeout);
|
|
103
|
-
timeout = setTimeout(() => task === null || task === void 0 ? void 0 : task(), intervalMs);
|
|
104
|
-
},
|
|
105
|
-
cancel: () => {
|
|
106
|
-
timeout && clearTimeout(timeout);
|
|
107
|
-
timeout = undefined;
|
|
108
|
-
},
|
|
109
|
-
setTask: (newTask) => task = newTask,
|
|
110
|
-
setInterval: (newInterval) => intervalMs = newInterval
|
|
111
|
-
};
|
|
71
|
+
//=======================================================//
|
|
72
|
+
export const encodeBigEndian = (e, t = 4) => {
|
|
73
|
+
let r = e;
|
|
74
|
+
const a = new Uint8Array(t);
|
|
75
|
+
for (let i = t - 1; i >= 0; i--) {
|
|
76
|
+
a[i] = 255 & r;
|
|
77
|
+
r >>>= 8;
|
|
78
|
+
}
|
|
79
|
+
return a;
|
|
112
80
|
};
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
const
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
};
|
|
133
|
-
return { delay, cancel };
|
|
81
|
+
export const toNumber = (t) => typeof t === "object" && t ? ("toNumber" in t ? t.toNumber() : t.low) : t || 0;
|
|
82
|
+
//=======================================================//
|
|
83
|
+
export const unixTimestampSeconds = (date = new Date()) => Math.floor(date.getTime() / 1000);
|
|
84
|
+
export const debouncedTimeout = (intervalMs = 1000, task) => {
|
|
85
|
+
let timeout;
|
|
86
|
+
return {
|
|
87
|
+
start: (newIntervalMs, newTask) => {
|
|
88
|
+
task = newTask || task;
|
|
89
|
+
intervalMs = newIntervalMs || intervalMs;
|
|
90
|
+
timeout && clearTimeout(timeout);
|
|
91
|
+
timeout = setTimeout(() => task?.(), intervalMs);
|
|
92
|
+
},
|
|
93
|
+
cancel: () => {
|
|
94
|
+
timeout && clearTimeout(timeout);
|
|
95
|
+
timeout = undefined;
|
|
96
|
+
},
|
|
97
|
+
setTask: (newTask) => (task = newTask),
|
|
98
|
+
setInterval: (newInterval) => (intervalMs = newInterval)
|
|
99
|
+
};
|
|
134
100
|
};
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
101
|
+
//=======================================================//
|
|
102
|
+
export const delay = (ms) => delayCancellable(ms).delay;
|
|
103
|
+
export const delayCancellable = (ms) => {
|
|
104
|
+
const stack = new Error().stack;
|
|
105
|
+
let timeout;
|
|
106
|
+
let reject;
|
|
107
|
+
const delay = new Promise((resolve, _reject) => {
|
|
108
|
+
timeout = setTimeout(resolve, ms);
|
|
109
|
+
reject = _reject;
|
|
110
|
+
});
|
|
111
|
+
const cancel = () => {
|
|
112
|
+
clearTimeout(timeout);
|
|
113
|
+
reject(new Boom("Cancelled", {
|
|
114
|
+
statusCode: 500,
|
|
115
|
+
data: {
|
|
116
|
+
stack
|
|
117
|
+
}
|
|
118
|
+
}));
|
|
119
|
+
};
|
|
120
|
+
return { delay, cancel };
|
|
121
|
+
};
|
|
122
|
+
//=======================================================//
|
|
123
|
+
export async function promiseTimeout(ms, promise) {
|
|
124
|
+
return new Promise(promise);
|
|
156
125
|
}
|
|
157
|
-
|
|
158
|
-
const generateMessageIDV2 = (userId) => {
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
}
|
|
126
|
+
//=======================================================//
|
|
127
|
+
export const generateMessageIDV2 = (userId) => {
|
|
128
|
+
const data = Buffer.alloc(8 + 20 + 16);
|
|
129
|
+
data.writeBigUInt64BE(BigInt(Math.floor(Date.now() / 1000)));
|
|
130
|
+
if (userId) {
|
|
131
|
+
const id = jidDecode(userId);
|
|
132
|
+
if (id?.user) {
|
|
133
|
+
data.write(id.user, 8);
|
|
134
|
+
data.write("@c.us", 8 + id.user.length);
|
|
167
135
|
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
136
|
+
}
|
|
137
|
+
const random = randomBytes(16);
|
|
138
|
+
random.copy(data, 28);
|
|
139
|
+
const hash = createHash("sha256").update(data).digest();
|
|
140
|
+
return "3EB0" + hash.toString("hex").toUpperCase().substring(0, 18);
|
|
172
141
|
};
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
listener = (update) => {
|
|
190
|
-
if (check(update)) {
|
|
191
|
-
resolve();
|
|
192
|
-
}
|
|
193
|
-
};
|
|
194
|
-
ev.on(event, listener);
|
|
195
|
-
})
|
|
196
|
-
.finally(() => {
|
|
197
|
-
ev.off(event, listener);
|
|
198
|
-
ev.off('connection.update', closeListener);
|
|
199
|
-
}));
|
|
200
|
-
};
|
|
201
|
-
}
|
|
202
|
-
exports.bindWaitForEvent = bindWaitForEvent;
|
|
203
|
-
const bindWaitForConnectionUpdate = (ev) => bindWaitForEvent(ev, 'connection.update');
|
|
204
|
-
exports.bindWaitForConnectionUpdate = bindWaitForConnectionUpdate;
|
|
205
|
-
const printQRIfNecessaryListener = (ev, logger) => {
|
|
206
|
-
ev.on('connection.update', async ({ qr }) => {
|
|
207
|
-
if (qr) {
|
|
208
|
-
const QR = await import('qrcode-terminal')
|
|
209
|
-
.then(m => m.default || m)
|
|
210
|
-
.catch(() => {
|
|
211
|
-
logger.error('QR code terminal not added as dependency');
|
|
212
|
-
});
|
|
213
|
-
QR === null || QR === void 0 ? void 0 : QR.generate(qr, { small: true });
|
|
142
|
+
//=======================================================//
|
|
143
|
+
export const generateMessageID = () => "3EB0" + randomBytes(18).toString("hex").toUpperCase();
|
|
144
|
+
export function bindWaitForEvent(ev, event) {
|
|
145
|
+
return async (check, timeoutMs) => {
|
|
146
|
+
let listener;
|
|
147
|
+
let closeListener;
|
|
148
|
+
await promiseTimeout(timeoutMs, (resolve, reject) => {
|
|
149
|
+
closeListener = ({ connection, lastDisconnect }) => {
|
|
150
|
+
if (connection === "close") {
|
|
151
|
+
reject(lastDisconnect?.error || new Boom("Connection Closed", { statusCode: DisconnectReason.connectionClosed }));
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
ev.on("connection.update", closeListener);
|
|
155
|
+
listener = async (update) => {
|
|
156
|
+
if (await check(update)) {
|
|
157
|
+
resolve();
|
|
214
158
|
}
|
|
159
|
+
};
|
|
160
|
+
ev.on(event, listener);
|
|
161
|
+
}).finally(() => {
|
|
162
|
+
ev.off(event, listener);
|
|
163
|
+
ev.off("connection.update", closeListener);
|
|
215
164
|
});
|
|
216
|
-
};
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
const
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
version: result.data.version,
|
|
231
|
-
isLatest: true
|
|
232
|
-
};
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
export const bindWaitForConnectionUpdate = (ev) => bindWaitForEvent(ev, "connection.update");
|
|
168
|
+
//=======================================================//
|
|
169
|
+
export const fetchLatestBaileysVersion = async (options = {}) => {
|
|
170
|
+
const URL = "https://raw.githubusercontent.com/WhiskeySockets/Baileys/master/src/Defaults/index.ts";
|
|
171
|
+
try {
|
|
172
|
+
const response = await fetch(URL, {
|
|
173
|
+
dispatcher: options.dispatcher,
|
|
174
|
+
method: "GET",
|
|
175
|
+
headers: options.headers
|
|
176
|
+
});
|
|
177
|
+
if (!response.ok) {
|
|
178
|
+
throw new Boom(`Failed to fetch latest Baileys version: ${response.statusText}`, { statusCode: response.status });
|
|
233
179
|
}
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
180
|
+
const text = await response.text();
|
|
181
|
+
const lines = text.split("\n");
|
|
182
|
+
const versionLine = lines[6];
|
|
183
|
+
const versionMatch = versionLine.match(/const version = \[(\d+),\s*(\d+),\s*(\d+)\]/);
|
|
184
|
+
if (versionMatch) {
|
|
185
|
+
const version = [parseInt(versionMatch[1]), parseInt(versionMatch[2]), parseInt(versionMatch[3])];
|
|
186
|
+
return {
|
|
187
|
+
version,
|
|
188
|
+
isLatest: true
|
|
189
|
+
};
|
|
240
190
|
}
|
|
191
|
+
else {
|
|
192
|
+
throw new Error("Could not parse version from Defaults/index.ts");
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
return {
|
|
197
|
+
version: version,
|
|
198
|
+
isLatest: false,
|
|
199
|
+
error
|
|
200
|
+
};
|
|
201
|
+
}
|
|
241
202
|
};
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
};
|
|
203
|
+
//=======================================================//
|
|
204
|
+
export const fetchLatestWaWebVersion = async (options = {}) => {
|
|
205
|
+
try {
|
|
206
|
+
const defaultHeaders = {
|
|
207
|
+
"sec-fetch-site": "none",
|
|
208
|
+
"user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"
|
|
209
|
+
};
|
|
210
|
+
const headers = { ...defaultHeaders, ...options.headers };
|
|
211
|
+
const response = await fetch("https://web.whatsapp.com/sw.js", {
|
|
212
|
+
...options,
|
|
213
|
+
method: "GET",
|
|
214
|
+
headers
|
|
215
|
+
});
|
|
216
|
+
if (!response.ok) {
|
|
217
|
+
throw new Boom(`Failed to fetch sw.js: ${response.statusText}`, { statusCode: response.status });
|
|
258
218
|
}
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
219
|
+
const data = await response.text();
|
|
220
|
+
const regex = /\\?"client_revision\\?":\s*(\d+)/;
|
|
221
|
+
const match = data.match(regex);
|
|
222
|
+
if (!match?.[1]) {
|
|
223
|
+
return {
|
|
224
|
+
version: version,
|
|
225
|
+
isLatest: false,
|
|
226
|
+
error: {
|
|
227
|
+
message: "Could not find client revision in the fetched content"
|
|
228
|
+
}
|
|
229
|
+
};
|
|
265
230
|
}
|
|
231
|
+
const clientRevision = match[1];
|
|
232
|
+
return {
|
|
233
|
+
version: [2, 3000, +clientRevision],
|
|
234
|
+
isLatest: true
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
return {
|
|
239
|
+
version: version,
|
|
240
|
+
isLatest: false,
|
|
241
|
+
error
|
|
242
|
+
};
|
|
243
|
+
}
|
|
266
244
|
};
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
const
|
|
270
|
-
|
|
271
|
-
return `${bytes.readUInt16BE()}.${bytes.readUInt16BE(2)}-`;
|
|
245
|
+
//=======================================================//
|
|
246
|
+
export const generateMdTagPrefix = () => {
|
|
247
|
+
const bytes = randomBytes(4);
|
|
248
|
+
return `${bytes.readUInt16BE()}.${bytes.readUInt16BE(2)}-`;
|
|
272
249
|
};
|
|
273
|
-
|
|
250
|
+
//=======================================================//
|
|
274
251
|
const STATUS_MAP = {
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
252
|
+
"sender": proto.WebMessageInfo.Status.SERVER_ACK,
|
|
253
|
+
"played": proto.WebMessageInfo.Status.PLAYED,
|
|
254
|
+
"read": proto.WebMessageInfo.Status.READ,
|
|
255
|
+
"read-self": proto.WebMessageInfo.Status.READ
|
|
278
256
|
};
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
return WAProto_1.proto.WebMessageInfo.Status.DELIVERY_ACK;
|
|
287
|
-
}
|
|
288
|
-
return status;
|
|
257
|
+
//=======================================================//
|
|
258
|
+
export const getStatusFromReceiptType = (type) => {
|
|
259
|
+
const status = STATUS_MAP[type];
|
|
260
|
+
if (typeof type === "undefined") {
|
|
261
|
+
return proto.WebMessageInfo.Status.DELIVERY_ACK;
|
|
262
|
+
}
|
|
263
|
+
return status;
|
|
289
264
|
};
|
|
290
|
-
|
|
265
|
+
//=======================================================//
|
|
291
266
|
const CODE_MAP = {
|
|
292
|
-
|
|
267
|
+
conflict: DisconnectReason.connectionReplaced
|
|
293
268
|
};
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
const
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
reason,
|
|
307
|
-
statusCode
|
|
308
|
-
};
|
|
269
|
+
//=======================================================//
|
|
270
|
+
export const getErrorCodeFromStreamError = (node) => {
|
|
271
|
+
const [reasonNode] = getAllBinaryNodeChildren(node);
|
|
272
|
+
let reason = reasonNode?.tag || "unknown";
|
|
273
|
+
const statusCode = +(node.attrs.code || CODE_MAP[reason] || DisconnectReason.badSession);
|
|
274
|
+
if (statusCode === DisconnectReason.restartRequired) {
|
|
275
|
+
reason = "restart required";
|
|
276
|
+
}
|
|
277
|
+
return {
|
|
278
|
+
reason,
|
|
279
|
+
statusCode
|
|
280
|
+
};
|
|
309
281
|
};
|
|
310
|
-
|
|
311
|
-
const getCallStatusFromNode = ({ tag, attrs }) => {
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
282
|
+
//=======================================================//
|
|
283
|
+
export const getCallStatusFromNode = ({ tag, attrs }) => {
|
|
284
|
+
let status;
|
|
285
|
+
switch (tag) {
|
|
286
|
+
case "offer":
|
|
287
|
+
case "offer_notice":
|
|
288
|
+
status = "offer";
|
|
289
|
+
break;
|
|
290
|
+
case "terminate":
|
|
291
|
+
if (attrs.reason === "timeout") {
|
|
292
|
+
status = "timeout";
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
status = "terminate";
|
|
296
|
+
}
|
|
297
|
+
break;
|
|
298
|
+
case "reject":
|
|
299
|
+
status = "reject";
|
|
300
|
+
break;
|
|
301
|
+
case "accept":
|
|
302
|
+
status = "accept";
|
|
303
|
+
break;
|
|
304
|
+
default:
|
|
305
|
+
status = "ringing";
|
|
306
|
+
break;
|
|
307
|
+
}
|
|
308
|
+
return status;
|
|
337
309
|
};
|
|
338
|
-
|
|
339
|
-
const UNEXPECTED_SERVER_CODE_TEXT =
|
|
340
|
-
const getCodeFromWSError = (error) => {
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
statusCode = code;
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
else if (((_b = error === null || error === void 0 ? void 0 : error.code) === null || _b === void 0 ? void 0 : _b.startsWith('E'))
|
|
350
|
-
|| ((_c = error === null || error === void 0 ? void 0 : error.message) === null || _c === void 0 ? void 0 : _c.includes('timed out'))) { // handle ETIMEOUT, ENOTFOUND etc
|
|
351
|
-
statusCode = 408;
|
|
310
|
+
//=======================================================//
|
|
311
|
+
const UNEXPECTED_SERVER_CODE_TEXT = "Unexpected server response: ";
|
|
312
|
+
export const getCodeFromWSError = (error) => {
|
|
313
|
+
let statusCode = 500;
|
|
314
|
+
if (error?.message?.includes(UNEXPECTED_SERVER_CODE_TEXT)) {
|
|
315
|
+
const code = +error?.message.slice(UNEXPECTED_SERVER_CODE_TEXT.length);
|
|
316
|
+
if (!Number.isNaN(code) && code >= 400) {
|
|
317
|
+
statusCode = code;
|
|
352
318
|
}
|
|
353
|
-
|
|
319
|
+
}
|
|
320
|
+
else if (
|
|
321
|
+
error?.code?.startsWith("E") ||
|
|
322
|
+
error?.message?.includes("timed out")) {
|
|
323
|
+
statusCode = 408;
|
|
324
|
+
}
|
|
325
|
+
return statusCode;
|
|
354
326
|
};
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
* @param platform AuthenticationCreds.platform
|
|
359
|
-
*/
|
|
360
|
-
const isWABusinessPlatform = (platform) => {
|
|
361
|
-
return platform === 'smbi' || platform === 'smba';
|
|
327
|
+
//=======================================================//
|
|
328
|
+
export const isWABusinessPlatform = (platform) => {
|
|
329
|
+
return platform === "smbi" || platform === "smba";
|
|
362
330
|
};
|
|
363
|
-
|
|
364
|
-
function trimUndefined(obj) {
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
}
|
|
331
|
+
//=======================================================//
|
|
332
|
+
export function trimUndefined(obj) {
|
|
333
|
+
for (const key in obj) {
|
|
334
|
+
if (typeof obj[key] === "undefined") {
|
|
335
|
+
delete obj[key];
|
|
369
336
|
}
|
|
370
|
-
|
|
337
|
+
}
|
|
338
|
+
return obj;
|
|
371
339
|
}
|
|
372
|
-
|
|
373
|
-
const CROCKFORD_CHARACTERS =
|
|
374
|
-
function bytesToCrockford(buffer) {
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
if (bitCount > 0) {
|
|
387
|
-
crockford.push(CROCKFORD_CHARACTERS.charAt((value << (5 - bitCount)) & 31));
|
|
340
|
+
//=======================================================//
|
|
341
|
+
const CROCKFORD_CHARACTERS = "123456789ABCDEFGHJKLMNPQRSTVWXYZ";
|
|
342
|
+
export function bytesToCrockford(buffer) {
|
|
343
|
+
let value = 0;
|
|
344
|
+
let bitCount = 0;
|
|
345
|
+
const crockford = [];
|
|
346
|
+
for (const element of buffer) {
|
|
347
|
+
value = (value << 8) | (element & 0xff);
|
|
348
|
+
bitCount += 8;
|
|
349
|
+
while (bitCount >= 5) {
|
|
350
|
+
crockford.push(CROCKFORD_CHARACTERS.charAt((value >>> (bitCount - 5)) & 31));
|
|
351
|
+
bitCount -= 5;
|
|
388
352
|
}
|
|
389
|
-
|
|
353
|
+
}
|
|
354
|
+
if (bitCount > 0) {
|
|
355
|
+
crockford.push(CROCKFORD_CHARACTERS.charAt((value << (5 - bitCount)) & 31));
|
|
356
|
+
}
|
|
357
|
+
return crockford.join("");
|
|
358
|
+
}
|
|
359
|
+
//=======================================================//
|
|
360
|
+
export function encodeNewsletterMessage(message) {
|
|
361
|
+
return proto.Message.encode(message).finish();
|
|
390
362
|
}
|
|
391
|
-
|
|
363
|
+
//=======================================================//
|