@pontalabs/baileys 1.0.6 → 1.0.7
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 +1 -1
- package/README.md +839 -267
- package/WAProto/GenerateStatics.sh +4 -3
- package/WAProto/WAProto.proto +511 -1215
- package/WAProto/index.d.ts +55 -14017
- package/WAProto/index.js +29 -97689
- package/lib/Defaults/index.d.ts +74 -72
- package/lib/Defaults/index.js +108 -94
- package/lib/Signal/Group/ciphertext-message.d.ts +7 -8
- package/lib/Signal/Group/ciphertext-message.js +16 -9
- package/lib/Signal/Group/group-session-builder.d.ts +13 -11
- package/lib/Signal/Group/group-session-builder.js +61 -19
- package/lib/Signal/Group/group_cipher.d.ts +16 -14
- package/lib/Signal/Group/group_cipher.js +70 -41
- package/lib/Signal/Group/index.d.ts +11 -12
- package/lib/Signal/Group/index.js +61 -12
- package/lib/Signal/Group/keyhelper.d.ts +14 -9
- package/lib/Signal/Group/keyhelper.js +58 -10
- package/lib/Signal/Group/sender-chain-key.d.ts +13 -13
- package/lib/Signal/Group/sender-chain-key.js +34 -13
- package/lib/Signal/Group/sender-key-distribution-message.d.ts +16 -16
- package/lib/Signal/Group/sender-key-distribution-message.js +36 -28
- package/lib/Signal/Group/sender-key-message.d.ts +18 -18
- package/lib/Signal/Group/sender-key-message.js +45 -38
- package/lib/Signal/Group/sender-key-name.d.ts +15 -14
- package/lib/Signal/Group/sender-key-name.js +31 -20
- package/lib/Signal/Group/sender-key-record.d.ts +25 -24
- package/lib/Signal/Group/sender-key-record.js +35 -18
- package/lib/Signal/Group/sender-key-state.d.ts +34 -29
- package/lib/Signal/Group/sender-key-state.js +100 -37
- package/lib/Signal/Group/sender-message-key.d.ts +10 -11
- package/lib/Signal/Group/sender-message-key.js +22 -15
- package/lib/Signal/libsignal.d.ts +8 -5
- package/lib/Signal/libsignal.js +142 -288
- package/lib/Signal/lid-mapping.d.ts +28 -23
- package/lib/Signal/lid-mapping.js +184 -277
- package/lib/Socket/Client/index.d.ts +2 -3
- package/lib/Socket/Client/index.js +22 -3
- package/lib/Socket/Client/types.d.ts +15 -15
- package/lib/Socket/Client/types.js +15 -8
- package/lib/Socket/Client/websocket.d.ts +12 -12
- package/lib/Socket/Client/websocket.js +37 -29
- package/lib/Socket/business.d.ts +178 -208
- package/lib/Socket/business.js +127 -91
- package/lib/Socket/chats.d.ts +93 -120
- package/lib/Socket/chats.js +652 -727
- package/lib/Socket/community.js +10 -2
- package/lib/Socket/groups.d.ts +111 -143
- package/lib/Socket/groups.js +186 -165
- package/lib/Socket/index.d.ts +183 -252
- package/lib/Socket/index.js +18 -38
- package/lib/Socket/messages-recv.d.ts +167 -196
- package/lib/Socket/messages-recv.js +1567 -1443
- package/lib/Socket/messages-send.d.ts +158 -192
- package/lib/Socket/messages-send.js +1208 -1102
- package/lib/Socket/newsletter.d.ts +138 -163
- package/lib/Socket/newsletter.js +249 -153
- package/lib/Socket/socket.d.ts +36 -50
- package/lib/Socket/socket.js +820 -749
- package/lib/Store/index.d.ts +4 -4
- package/lib/Store/index.js +24 -4
- package/lib/Store/make-in-memory-store.d.ts +104 -44
- package/lib/Store/make-in-memory-store.js +213 -199
- package/lib/Store/make-ordered-dictionary.d.ts +12 -13
- package/lib/Store/make-ordered-dictionary.js +45 -38
- package/lib/Store/object-repository.d.ts +10 -11
- package/lib/Store/object-repository.js +16 -9
- package/lib/Types/Auth.d.ts +97 -93
- package/lib/Types/Auth.js +3 -2
- package/lib/Types/Bussines.js +3 -2
- package/lib/Types/Call.d.ts +13 -14
- package/lib/Types/Call.js +3 -2
- package/lib/Types/Chat.d.ts +97 -78
- package/lib/Types/Chat.js +9 -8
- package/lib/Types/Contact.d.ts +9 -12
- package/lib/Types/Contact.js +3 -2
- package/lib/Types/Events.d.ts +176 -206
- package/lib/Types/Events.js +3 -2
- package/lib/Types/GroupMetadata.d.ts +48 -53
- package/lib/Types/GroupMetadata.js +3 -2
- package/lib/Types/Label.d.ts +14 -13
- package/lib/Types/Label.js +30 -24
- package/lib/Types/LabelAssociation.d.ts +20 -15
- package/lib/Types/LabelAssociation.js +12 -6
- package/lib/Types/Message.d.ts +412 -248
- package/lib/Types/Message.js +19 -17
- package/lib/Types/Product.d.ts +71 -58
- package/lib/Types/Product.js +3 -2
- package/lib/Types/Signal.d.ts +82 -71
- package/lib/Types/Signal.js +3 -2
- package/lib/Types/Socket.d.ts +81 -76
- package/lib/Types/Socket.js +3 -3
- package/lib/Types/State.d.ts +19 -75
- package/lib/Types/State.js +14 -56
- package/lib/Types/USync.d.ts +8 -8
- package/lib/Types/USync.js +3 -2
- package/lib/Types/index.d.ts +62 -47
- package/lib/Types/index.js +50 -26
- package/lib/Utils/auth-utils.d.ts +10 -13
- package/lib/Utils/auth-utils.js +472 -213
- package/lib/Utils/business.d.ts +20 -14
- package/lib/Utils/business.js +134 -110
- package/lib/Utils/chat-utils.d.ts +70 -88
- package/lib/Utils/chat-utils.js +403 -466
- package/lib/Utils/crypto.d.ts +46 -27
- package/lib/Utils/crypto.js +188 -117
- package/lib/Utils/decode-wa-message.d.ts +45 -58
- package/lib/Utils/decode-wa-message.js +311 -212
- package/lib/Utils/event-buffer.d.ts +17 -14
- package/lib/Utils/event-buffer.js +296 -321
- package/lib/Utils/generics.d.ts +92 -66
- package/lib/Utils/generics.js +436 -270
- package/lib/Utils/history.d.ts +23 -24
- package/lib/Utils/history.js +76 -106
- package/lib/Utils/index.d.ts +21 -24
- package/lib/Utils/index.js +41 -24
- package/lib/Utils/link-preview.d.ts +14 -12
- package/lib/Utils/link-preview.js +75 -40
- package/lib/Utils/logger.d.ts +11 -10
- package/lib/Utils/logger.js +7 -3
- package/lib/Utils/lt-hash.d.ts +14 -8
- package/lib/Utils/lt-hash.js +53 -3
- package/lib/Utils/make-mutex.d.ts +7 -7
- package/lib/Utils/make-mutex.js +44 -28
- package/lib/Utils/message-retry-manager.d.ts +88 -115
- package/lib/Utils/message-retry-manager.js +160 -265
- package/lib/Utils/messages-media.d.ts +107 -105
- package/lib/Utils/messages-media.js +619 -548
- package/lib/Utils/messages.d.ts +66 -52
- package/lib/Utils/messages.js +1558 -1730
- package/lib/Utils/noise-handler.d.ts +18 -18
- package/lib/Utils/noise-handler.js +130 -176
- package/lib/Utils/process-message.d.ts +32 -43
- package/lib/Utils/process-message.js +282 -484
- package/lib/Utils/rich-message-utils.js +724 -1220
- package/lib/Utils/signal.d.ts +32 -37
- package/lib/Utils/signal.js +105 -140
- package/lib/Utils/use-multi-file-auth-state.d.ts +5 -5
- package/lib/Utils/use-multi-file-auth-state.js +120 -70
- package/lib/Utils/use-single-file-auth-state.d.ts +13 -11
- package/lib/Utils/use-single-file-auth-state.js +66 -92
- package/lib/Utils/validate-connection.d.ts +13 -11
- package/lib/Utils/validate-connection.js +113 -128
- package/lib/WABinary/constants.d.ts +27 -25
- package/lib/WABinary/constants.js +1292 -1451
- package/lib/WABinary/decode.d.ts +9 -7
- package/lib/WABinary/decode.js +189 -163
- package/lib/WABinary/encode.d.ts +3 -3
- package/lib/WABinary/encode.js +155 -110
- package/lib/WABinary/generic-utils.d.ts +27 -14
- package/lib/WABinary/generic-utils.js +105 -177
- package/lib/WABinary/index.d.ts +5 -6
- package/lib/WABinary/index.js +25 -6
- package/lib/WABinary/jid-utils.d.ts +54 -41
- package/lib/WABinary/jid-utils.js +152 -83
- package/lib/WABinary/types.d.ts +13 -10
- package/lib/WABinary/types.js +3 -2
- package/lib/WAM/BinaryInfo.d.ts +15 -8
- package/lib/WAM/BinaryInfo.js +14 -7
- package/lib/WAM/constants.d.ts +37 -30
- package/lib/WAM/constants.js +11983 -19465
- package/lib/WAM/encode.d.ts +3 -3
- package/lib/WAM/encode.js +109 -95
- package/lib/WAM/index.d.ts +3 -4
- package/lib/WAM/index.js +23 -4
- package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +9 -9
- package/lib/WAUSync/Protocols/USyncContactProtocol.js +21 -37
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +22 -19
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +26 -18
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +12 -11
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +20 -12
- package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +12 -11
- package/lib/WAUSync/Protocols/USyncStatusProtocol.js +24 -16
- package/lib/WAUSync/Protocols/index.d.ts +6 -6
- package/lib/WAUSync/Protocols/index.js +26 -6
- package/lib/WAUSync/USyncQuery.d.ts +28 -27
- package/lib/WAUSync/USyncQuery.js +62 -68
- package/lib/WAUSync/USyncUser.d.ts +10 -15
- package/lib/WAUSync/USyncUser.js +19 -20
- package/lib/WAUSync/index.d.ts +3 -4
- package/lib/WAUSync/index.js +23 -4
- package/lib/index.d.ts +12 -11
- package/lib/index.js +39 -12
- package/package.json +42 -86
- package/engine-requirements.js +0 -10
package/lib/Utils/generics.js
CHANGED
|
@@ -1,196 +1,364 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
"use strict"
|
|
2
|
+
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k)
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k] } }
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc)
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k
|
|
12
|
+
o[k2] = m[k]
|
|
13
|
+
}))
|
|
14
|
+
|
|
15
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
16
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v })
|
|
17
|
+
}) : function(o, v) {
|
|
18
|
+
o["default"] = v
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
22
|
+
if (mod && mod.__esModule) return mod
|
|
23
|
+
var result = {}
|
|
24
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k)
|
|
25
|
+
__setModuleDefault(result, mod)
|
|
26
|
+
return result
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
30
|
+
return (mod && mod.__esModule) ? mod : { "default": mod }
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
Object.defineProperty(exports, "__esModule", { value: true })
|
|
34
|
+
|
|
35
|
+
const boom_1 = require("@hapi/boom")
|
|
36
|
+
const axios_1 = __importDefault(require("axios"))
|
|
37
|
+
const crypto_1 = require("crypto")
|
|
38
|
+
const crypto_2 = require("./crypto")
|
|
39
|
+
const os_1 = require("os")
|
|
40
|
+
const WAProto_1 = require("../../WAProto")
|
|
41
|
+
const baileysVersion = [2, 3000, 1027934701];
|
|
42
|
+
const Types_1 = require("../Types")
|
|
43
|
+
const WABinary_1 = require("../WABinary")
|
|
44
|
+
|
|
45
|
+
const COMPANION_PLATFORM_MAP = {
|
|
46
|
+
'Chrome': '49',
|
|
47
|
+
'Edge': '50',
|
|
48
|
+
'Firefox': '51',
|
|
49
|
+
'Opera': '53',
|
|
50
|
+
'Safari': '54',
|
|
51
|
+
'Brave': '1.79.112',
|
|
52
|
+
'Vivaldi': '6.2.3105.58',
|
|
53
|
+
'Tor': '12.5.3',
|
|
54
|
+
'Yandex': '23.7.1',
|
|
55
|
+
'Falkon': '22.08.3',
|
|
56
|
+
'Epiphany': '44.2'
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const PLATFORM_MAP = {
|
|
60
|
+
'aix': 'AIX',
|
|
61
|
+
'darwin': 'Mac OS',
|
|
62
|
+
'win32': 'Windows',
|
|
63
|
+
'android': 'Android',
|
|
64
|
+
'freebsd': 'FreeBSD',
|
|
65
|
+
'openbsd': 'OpenBSD',
|
|
66
|
+
'sunos': 'Solaris',
|
|
67
|
+
'linux': 'Linux',
|
|
68
|
+
'ubuntu': 'Ubuntu',
|
|
69
|
+
'ios': 'iOS',
|
|
70
|
+
'baileys': 'Baileys',
|
|
71
|
+
'chromeos': 'Chrome OS',
|
|
72
|
+
'tizen': 'Tizen',
|
|
73
|
+
'watchos': 'watchOS',
|
|
74
|
+
'wearos': 'Wear OS',
|
|
75
|
+
'harmonyos': 'HarmonyOS',
|
|
76
|
+
'kaios': 'KaiOS',
|
|
77
|
+
'smarttv': 'Smart TV',
|
|
78
|
+
'raspberrypi': 'Raspberry Pi OS',
|
|
79
|
+
'symbian': 'Symbian',
|
|
80
|
+
'blackberry': 'Blackberry OS',
|
|
81
|
+
'windowsphone': 'Windows Phone'
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const PLATFORM_VERSIONS = {
|
|
85
|
+
'ubuntu': '22.04.4',
|
|
86
|
+
'darwin': '18.5',
|
|
87
|
+
'win32': '10.0.22631',
|
|
88
|
+
'android': '14.0.0',
|
|
89
|
+
'freebsd': '13.2',
|
|
90
|
+
'openbsd': '7.3',
|
|
91
|
+
'sunos': '11',
|
|
92
|
+
'linux': '6.5',
|
|
93
|
+
'ios': '18.2',
|
|
94
|
+
'baileys': '6.5.0',
|
|
95
|
+
'chromeos': '117.0.5938.132',
|
|
96
|
+
'tizen': '6.5',
|
|
97
|
+
'watchos': '10.1',
|
|
98
|
+
'wearos': '4.1',
|
|
99
|
+
'harmonyos': '4.0.0',
|
|
100
|
+
'kaios': '3.1',
|
|
101
|
+
'smarttv': '23.3.1',
|
|
102
|
+
'raspberrypi': '11 (Bullseye)',
|
|
103
|
+
'symbian': '3',
|
|
104
|
+
'blackberry': '10.3.3',
|
|
105
|
+
'windowsphone': '8.1'
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const Browsers = {
|
|
109
|
+
ubuntu: (browser) => {
|
|
110
|
+
return [PLATFORM_MAP['ubuntu'], browser, PLATFORM_VERSIONS['ubuntu']]
|
|
111
|
+
},
|
|
112
|
+
macOS: (browser) => {
|
|
113
|
+
return [PLATFORM_MAP['darwin'], browser, PLATFORM_VERSIONS['darwin']]
|
|
114
|
+
},
|
|
115
|
+
windows: (browser) => {
|
|
116
|
+
return [PLATFORM_MAP['win32'], browser, PLATFORM_VERSIONS['win32']]
|
|
117
|
+
},
|
|
118
|
+
linux: (browser) => {
|
|
119
|
+
return [PLATFORM_MAP['linux'], browser, PLATFORM_VERSIONS['linux']]
|
|
120
|
+
},
|
|
121
|
+
solaris: (browser) => {
|
|
122
|
+
return [PLATFORM_MAP['sunos'], browser, PLATFORM_VERSIONS['sunos']]
|
|
123
|
+
},
|
|
124
|
+
baileys: (browser) => {
|
|
125
|
+
return [PLATFORM_MAP['baileys'], browser, PLATFORM_VERSIONS['baileys']]
|
|
126
|
+
},
|
|
127
|
+
android: (browser) => {
|
|
128
|
+
return [PLATFORM_MAP['android'], browser, PLATFORM_VERSIONS['android']]
|
|
129
|
+
},
|
|
130
|
+
iOS: (browser) => {
|
|
131
|
+
return [PLATFORM_MAP['ios'], browser, PLATFORM_VERSIONS['ios']]
|
|
132
|
+
},
|
|
133
|
+
kaiOS: (browser) => {
|
|
134
|
+
return [PLATFORM_MAP['kaios'], browser, PLATFORM_VERSIONS['kaios']]
|
|
135
|
+
},
|
|
136
|
+
chromeOS: (browser) => {
|
|
137
|
+
return [PLATFORM_MAP['chromeos'], browser, PLATFORM_VERSIONS['chromeos']]
|
|
138
|
+
},
|
|
139
|
+
appropriate: (browser) => {
|
|
140
|
+
const platform = os_1.platform()
|
|
141
|
+
const platformName = PLATFORM_MAP[platform] || 'Unknown OS'
|
|
142
|
+
return [platformName, browser, PLATFORM_VERSIONS[platform] || 'latest']
|
|
143
|
+
},
|
|
144
|
+
custom: (platform, browser, version) => {
|
|
145
|
+
const platformName = PLATFORM_MAP[platform.toLowerCase()] || platform
|
|
146
|
+
return [platformName, browser, version || PLATFORM_VERSIONS[platform] || 'latest']
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
const BufferJSON = {
|
|
9
151
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
10
152
|
replacer: (k, value) => {
|
|
11
153
|
if (Buffer.isBuffer(value) || value instanceof Uint8Array || value?.type === 'Buffer') {
|
|
12
|
-
return { type: 'Buffer', data: Buffer.from(value?.data || value).toString('base64') }
|
|
154
|
+
return { type: 'Buffer', data: Buffer.from(value?.data || value).toString('base64') }
|
|
13
155
|
}
|
|
14
|
-
return value
|
|
156
|
+
return value
|
|
15
157
|
},
|
|
16
158
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
17
159
|
reviver: (_, value) => {
|
|
18
|
-
if (typeof value === 'object' && value
|
|
19
|
-
|
|
160
|
+
if (typeof value === 'object' && !!value && (value.buffer === true || value.type === 'Buffer')) {
|
|
161
|
+
const val = value.data || value.value
|
|
162
|
+
return typeof val === 'string' ? Buffer.from(val, 'base64') : Buffer.from(val || [])
|
|
20
163
|
}
|
|
21
|
-
|
|
22
|
-
const keys = Object.keys(value);
|
|
23
|
-
if (keys.length > 0 && keys.every(k => !isNaN(parseInt(k, 10)))) {
|
|
24
|
-
const values = Object.values(value);
|
|
25
|
-
if (values.every(v => typeof v === 'number')) {
|
|
26
|
-
return Buffer.from(values);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
return value;
|
|
164
|
+
return value
|
|
31
165
|
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const getPlatformId = (browser) => {
|
|
169
|
+
const platformType = WAProto_1.proto.DeviceProps.PlatformType[browser.toUpperCase()]
|
|
170
|
+
return platformType ? platformType.toString() : '1'
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
const getKeyAuthor = (key, meId = 'me') => {
|
|
174
|
+
return key?.fromMe ? meId : key?.participant || key?.remoteJid || ''
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
const writeRandomPadMax16 = (msg) => {
|
|
178
|
+
const pad = crypto_1.randomBytes(1)
|
|
179
|
+
const padLength = (pad[0] & 0x0f) + 1
|
|
180
|
+
|
|
181
|
+
return Buffer.concat([msg, Buffer.alloc(padLength, padLength)])
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
const unpadRandomMax16 = (e) => {
|
|
185
|
+
const t = new Uint8Array(e)
|
|
44
186
|
if (0 === t.length) {
|
|
45
|
-
throw new Error('unpadPkcs7 given empty bytes')
|
|
187
|
+
throw new Error('unpadPkcs7 given empty bytes')
|
|
46
188
|
}
|
|
47
|
-
var r = t[t.length - 1]
|
|
189
|
+
var r = t[t.length - 1]
|
|
48
190
|
if (r > t.length) {
|
|
49
|
-
throw new Error(`unpad given ${t.length} bytes, but pad is ${r}`)
|
|
191
|
+
throw new Error(`unpad given ${t.length} bytes, but pad is ${r}`)
|
|
50
192
|
}
|
|
51
|
-
return new Uint8Array(t.buffer, t.byteOffset, t.length - r)
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
193
|
+
return new Uint8Array(t.buffer, t.byteOffset, t.length - r)
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const encodeWAMessage = (message) => {
|
|
197
|
+
return writeRandomPadMax16(WAProto_1.proto.Message.encode(message).finish())
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
const encodeNewsletterMessage = (message) => {
|
|
201
|
+
return WAProto_1.proto.Message.encode(message).finish()
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
const generateRegistrationId = () => {
|
|
205
|
+
return Uint16Array.from(crypto_1.randomBytes(2))[0] & 16383
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
const encodeBigEndian = (e, t = 4) => {
|
|
209
|
+
let r = e
|
|
210
|
+
const a = new Uint8Array(t)
|
|
66
211
|
for (let i = t - 1; i >= 0; i--) {
|
|
67
|
-
a[i] = 255 & r
|
|
68
|
-
r >>>= 8
|
|
212
|
+
a[i] = 255 & r
|
|
213
|
+
r >>>= 8
|
|
69
214
|
}
|
|
70
|
-
return a
|
|
71
|
-
}
|
|
72
|
-
|
|
215
|
+
return a
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
const toNumber = (t) => ((typeof t === 'object' && t) ? ('toNumber' in t ? t.toNumber() : t.low) : t || 0)
|
|
219
|
+
|
|
73
220
|
/** unix timestamp of a date in seconds */
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
221
|
+
const unixTimestampSeconds = (date = new Date()) => Math.floor(date.getTime() / 1000)
|
|
222
|
+
|
|
223
|
+
const debouncedTimeout = (intervalMs = 1000, task) => {
|
|
224
|
+
let timeout
|
|
77
225
|
return {
|
|
78
226
|
start: (newIntervalMs, newTask) => {
|
|
79
|
-
task = newTask || task
|
|
80
|
-
intervalMs = newIntervalMs || intervalMs
|
|
81
|
-
timeout && clearTimeout(timeout)
|
|
82
|
-
timeout = setTimeout(() => task?.(), intervalMs)
|
|
227
|
+
task = newTask || task
|
|
228
|
+
intervalMs = newIntervalMs || intervalMs
|
|
229
|
+
timeout && clearTimeout(timeout)
|
|
230
|
+
timeout = setTimeout(() => task?.(), intervalMs)
|
|
83
231
|
},
|
|
84
232
|
cancel: () => {
|
|
85
|
-
timeout && clearTimeout(timeout)
|
|
86
|
-
timeout = undefined
|
|
233
|
+
timeout && clearTimeout(timeout)
|
|
234
|
+
timeout = undefined
|
|
87
235
|
},
|
|
88
|
-
setTask: (newTask) =>
|
|
89
|
-
setInterval: (newInterval) =>
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
236
|
+
setTask: (newTask) => task = newTask,
|
|
237
|
+
setInterval: (newInterval) => intervalMs = newInterval
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
const delay = (ms) => {
|
|
242
|
+
return delayCancellable(ms).delay
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
const delayCancellable = (ms) => {
|
|
246
|
+
const stack = new Error().stack
|
|
247
|
+
let timeout
|
|
248
|
+
let reject
|
|
97
249
|
const delay = new Promise((resolve, _reject) => {
|
|
98
|
-
timeout = setTimeout(resolve, ms)
|
|
99
|
-
reject = _reject
|
|
100
|
-
})
|
|
250
|
+
timeout = setTimeout(resolve, ms)
|
|
251
|
+
reject = _reject
|
|
252
|
+
})
|
|
101
253
|
const cancel = () => {
|
|
102
|
-
clearTimeout(timeout)
|
|
103
|
-
reject(new Boom('Cancelled', {
|
|
254
|
+
clearTimeout(timeout)
|
|
255
|
+
reject(new boom_1.Boom('Cancelled', {
|
|
104
256
|
statusCode: 500,
|
|
105
257
|
data: {
|
|
106
258
|
stack
|
|
107
259
|
}
|
|
108
|
-
}))
|
|
109
|
-
}
|
|
110
|
-
return { delay, cancel }
|
|
111
|
-
}
|
|
112
|
-
|
|
260
|
+
}))
|
|
261
|
+
}
|
|
262
|
+
return { delay, cancel }
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
async function promiseTimeout(ms, promise) {
|
|
113
266
|
if (!ms) {
|
|
114
|
-
return new Promise(promise)
|
|
267
|
+
return new Promise(promise)
|
|
115
268
|
}
|
|
116
|
-
const stack = new Error().stack
|
|
269
|
+
const stack = new Error().stack
|
|
117
270
|
// Create a promise that rejects in <ms> milliseconds
|
|
118
|
-
const { delay, cancel } = delayCancellable(ms)
|
|
271
|
+
const { delay, cancel } = delayCancellable(ms)
|
|
119
272
|
const p = new Promise((resolve, reject) => {
|
|
120
|
-
delay
|
|
121
|
-
.
|
|
122
|
-
statusCode: DisconnectReason.timedOut,
|
|
273
|
+
delay.then(() => reject(new boom_1.Boom('Timed Out', {
|
|
274
|
+
statusCode: Types_1.DisconnectReason.timedOut,
|
|
123
275
|
data: {
|
|
124
276
|
stack
|
|
125
277
|
}
|
|
126
|
-
})))
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
const data = Buffer.alloc(8 + 20 + 16);
|
|
136
|
-
data.writeBigUInt64BE(BigInt(Math.floor(Date.now() / 1000)));
|
|
278
|
+
}))).catch(err => reject(err))
|
|
279
|
+
promise(resolve, reject)
|
|
280
|
+
}).finally(cancel)
|
|
281
|
+
return p
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
const generateMessageID = (userId) => {
|
|
285
|
+
const data = Buffer.alloc(8 + 20 + 16)
|
|
286
|
+
data.writeBigUInt64BE(BigInt(Math.floor(Date.now() / 1000)))
|
|
137
287
|
if (userId) {
|
|
138
|
-
const id = jidDecode(userId)
|
|
288
|
+
const id = WABinary_1.jidDecode(userId)
|
|
139
289
|
if (id?.user) {
|
|
140
|
-
data.write(id.user, 8)
|
|
141
|
-
data.write('@c.us', 8 + id.user.length)
|
|
290
|
+
data.write(id.user, 8)
|
|
291
|
+
data.write('@c.us', 8 + id.user.length)
|
|
142
292
|
}
|
|
143
293
|
}
|
|
144
|
-
const random = randomBytes(
|
|
145
|
-
random.copy(data, 28)
|
|
146
|
-
const
|
|
147
|
-
|
|
294
|
+
const random = crypto_1.randomBytes(20)
|
|
295
|
+
random.copy(data, 28)
|
|
296
|
+
const sha = asciiDecode([89, 85, 69, 80, 79, 78, 84, 65])
|
|
297
|
+
const hash = crypto_1.createHash('sha256').update(data).digest()
|
|
298
|
+
return sha + hash.toString('hex').toUpperCase().substring(0, 18)
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// code is inspired by whatsmeow
|
|
302
|
+
const generateParticipantHashV2 = (participants) => {
|
|
303
|
+
participants.sort()
|
|
304
|
+
const sha256Hash = crypto_2.sha256(Buffer.from(participants.join(''))).toString('base64')
|
|
305
|
+
return '2:' + sha256Hash.slice(0, 6)
|
|
148
306
|
};
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
export function bindWaitForEvent(ev, event) {
|
|
307
|
+
|
|
308
|
+
function bindWaitForEvent(ev, event) {
|
|
152
309
|
return async (check, timeoutMs) => {
|
|
153
|
-
let listener
|
|
154
|
-
let closeListener
|
|
155
|
-
await promiseTimeout(timeoutMs, (resolve, reject) => {
|
|
310
|
+
let listener
|
|
311
|
+
let closeListener
|
|
312
|
+
await (promiseTimeout(timeoutMs, (resolve, reject) => {
|
|
156
313
|
closeListener = ({ connection, lastDisconnect }) => {
|
|
157
314
|
if (connection === 'close') {
|
|
158
|
-
reject(lastDisconnect?.error
|
|
315
|
+
reject((lastDisconnect?.error)
|
|
316
|
+
|| new boom_1.Boom('Connection Closed', { statusCode: Types_1.DisconnectReason.connectionClosed }))
|
|
159
317
|
}
|
|
160
|
-
}
|
|
161
|
-
ev.on('connection.update', closeListener)
|
|
318
|
+
}
|
|
319
|
+
ev.on('connection.update', closeListener)
|
|
162
320
|
listener = async (update) => {
|
|
163
321
|
if (await check(update)) {
|
|
164
|
-
resolve()
|
|
322
|
+
resolve()
|
|
165
323
|
}
|
|
166
|
-
}
|
|
167
|
-
ev.on(event, listener)
|
|
324
|
+
}
|
|
325
|
+
ev.on(event, listener)
|
|
168
326
|
}).finally(() => {
|
|
169
|
-
ev.off(event, listener)
|
|
170
|
-
ev.off('connection.update', closeListener)
|
|
171
|
-
})
|
|
172
|
-
}
|
|
327
|
+
ev.off(event, listener)
|
|
328
|
+
ev.off('connection.update', closeListener)
|
|
329
|
+
}))
|
|
330
|
+
}
|
|
173
331
|
}
|
|
174
|
-
|
|
332
|
+
|
|
333
|
+
const bindWaitForConnectionUpdate = (ev) => {
|
|
334
|
+
return bindWaitForEvent(ev, 'connection.update')
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
const printQRIfNecessaryListener = (ev, logger) => {
|
|
338
|
+
ev.on('connection.update', async ({ qr }) => {
|
|
339
|
+
if (qr) {
|
|
340
|
+
const QR = await Promise.resolve().then(() => __importStar(require('qrcode-terminal'))).then(m => m.default || m)
|
|
341
|
+
.catch(() => {
|
|
342
|
+
logger.error('QR code terminal not added as dependency')
|
|
343
|
+
})
|
|
344
|
+
QR?.generate(qr, { small: true })
|
|
345
|
+
}
|
|
346
|
+
})
|
|
347
|
+
}
|
|
348
|
+
|
|
175
349
|
/**
|
|
176
350
|
* utility that fetches latest baileys version from the master branch.
|
|
177
351
|
* Use to ensure your WA connection is always on the latest version
|
|
178
352
|
*/
|
|
179
|
-
|
|
353
|
+
const fetchLatestBaileysVersion = async (options = {}) => {
|
|
180
354
|
const URL = 'https://raw.githubusercontent.com/WhiskeySockets/Baileys/master/src/Defaults/index.ts';
|
|
181
355
|
try {
|
|
182
|
-
const
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
headers: options.headers
|
|
356
|
+
const result = await axios_1.default.get(URL, {
|
|
357
|
+
...options,
|
|
358
|
+
responseType: 'text'
|
|
186
359
|
});
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
}
|
|
190
|
-
const text = await response.text();
|
|
191
|
-
// Extract version from line 7 (const version = [...])
|
|
192
|
-
const lines = text.split('\n');
|
|
193
|
-
const versionLine = lines[6]; // Line 7 (0-indexed)
|
|
360
|
+
const lines = result.data.split('\n');
|
|
361
|
+
const versionLine = lines[6];
|
|
194
362
|
const versionMatch = versionLine.match(/const version = \[(\d+),\s*(\d+),\s*(\d+)\]/);
|
|
195
363
|
if (versionMatch) {
|
|
196
364
|
const version = [parseInt(versionMatch[1]), parseInt(versionMatch[2]), parseInt(versionMatch[3])];
|
|
@@ -198,58 +366,10 @@ export const fetchLatestBaileysVersion = async (options = {}) => {
|
|
|
198
366
|
version,
|
|
199
367
|
isLatest: true
|
|
200
368
|
};
|
|
201
|
-
}
|
|
202
|
-
else {
|
|
369
|
+
} else {
|
|
203
370
|
throw new Error('Could not parse version from Defaults/index.ts');
|
|
204
371
|
}
|
|
205
|
-
}
|
|
206
|
-
catch (error) {
|
|
207
|
-
return {
|
|
208
|
-
version: baileysVersion,
|
|
209
|
-
isLatest: false,
|
|
210
|
-
error
|
|
211
|
-
};
|
|
212
|
-
}
|
|
213
|
-
};
|
|
214
|
-
/**
|
|
215
|
-
* A utility that fetches the latest web version of whatsapp.
|
|
216
|
-
* Use to ensure your WA connection is always on the latest version
|
|
217
|
-
*/
|
|
218
|
-
export const fetchLatestWaWebVersion = async (options = {}) => {
|
|
219
|
-
try {
|
|
220
|
-
// Absolute minimal headers required to bypass anti-bot detection
|
|
221
|
-
const defaultHeaders = {
|
|
222
|
-
'sec-fetch-site': 'none',
|
|
223
|
-
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36'
|
|
224
|
-
};
|
|
225
|
-
const headers = { ...defaultHeaders, ...options.headers };
|
|
226
|
-
const response = await fetch('https://web.whatsapp.com/sw.js', {
|
|
227
|
-
...options,
|
|
228
|
-
method: 'GET',
|
|
229
|
-
headers
|
|
230
|
-
});
|
|
231
|
-
if (!response.ok) {
|
|
232
|
-
throw new Boom(`Failed to fetch sw.js: ${response.statusText}`, { statusCode: response.status });
|
|
233
|
-
}
|
|
234
|
-
const data = await response.text();
|
|
235
|
-
const regex = /\\?"client_revision\\?":\s*(\d+)/;
|
|
236
|
-
const match = data.match(regex);
|
|
237
|
-
if (!match?.[1]) {
|
|
238
|
-
return {
|
|
239
|
-
version: baileysVersion,
|
|
240
|
-
isLatest: false,
|
|
241
|
-
error: {
|
|
242
|
-
message: 'Could not find client revision in the fetched content'
|
|
243
|
-
}
|
|
244
|
-
};
|
|
245
|
-
}
|
|
246
|
-
const clientRevision = match[1];
|
|
247
|
-
return {
|
|
248
|
-
version: [2, 3000, +clientRevision],
|
|
249
|
-
isLatest: true
|
|
250
|
-
};
|
|
251
|
-
}
|
|
252
|
-
catch (error) {
|
|
372
|
+
} catch (error) {
|
|
253
373
|
return {
|
|
254
374
|
version: baileysVersion,
|
|
255
375
|
isLatest: false,
|
|
@@ -257,137 +377,183 @@ export const fetchLatestWaWebVersion = async (options = {}) => {
|
|
|
257
377
|
};
|
|
258
378
|
}
|
|
259
379
|
};
|
|
380
|
+
|
|
260
381
|
/** unique message tag prefix for MD clients */
|
|
261
|
-
|
|
262
|
-
const bytes = randomBytes(4)
|
|
263
|
-
return `${bytes.readUInt16BE()}.${bytes.readUInt16BE(2)}
|
|
264
|
-
}
|
|
382
|
+
const generateMdTagPrefix = () => {
|
|
383
|
+
const bytes = crypto_1.randomBytes(4)
|
|
384
|
+
return `${bytes.readUInt16BE()}.${bytes.readUInt16BE(2)}-`
|
|
385
|
+
}
|
|
386
|
+
|
|
265
387
|
const STATUS_MAP = {
|
|
266
|
-
sender: proto.WebMessageInfo.Status.SERVER_ACK,
|
|
267
|
-
played: proto.WebMessageInfo.Status.PLAYED,
|
|
268
|
-
read: proto.WebMessageInfo.Status.READ,
|
|
269
|
-
'read-self': proto.WebMessageInfo.Status.READ
|
|
270
|
-
}
|
|
388
|
+
'sender': WAProto_1.proto.WebMessageInfo.Status.SERVER_ACK,
|
|
389
|
+
'played': WAProto_1.proto.WebMessageInfo.Status.PLAYED,
|
|
390
|
+
'read': WAProto_1.proto.WebMessageInfo.Status.READ,
|
|
391
|
+
'read-self': WAProto_1.proto.WebMessageInfo.Status.READ
|
|
392
|
+
}
|
|
393
|
+
|
|
271
394
|
/**
|
|
272
395
|
* Given a type of receipt, returns what the new status of the message should be
|
|
273
396
|
* @param type type from receipt
|
|
274
397
|
*/
|
|
275
|
-
|
|
276
|
-
const status = STATUS_MAP[type]
|
|
398
|
+
const getStatusFromReceiptType = (type) => {
|
|
399
|
+
const status = STATUS_MAP[type]
|
|
277
400
|
if (typeof type === 'undefined') {
|
|
278
|
-
return proto.WebMessageInfo.Status.DELIVERY_ACK
|
|
401
|
+
return WAProto_1.proto.WebMessageInfo.Status.DELIVERY_ACK
|
|
279
402
|
}
|
|
280
|
-
return status
|
|
281
|
-
}
|
|
403
|
+
return status
|
|
404
|
+
}
|
|
405
|
+
|
|
282
406
|
const CODE_MAP = {
|
|
283
|
-
conflict: DisconnectReason.connectionReplaced
|
|
284
|
-
}
|
|
407
|
+
conflict: Types_1.DisconnectReason.connectionReplaced
|
|
408
|
+
}
|
|
409
|
+
|
|
285
410
|
/**
|
|
286
411
|
* Stream errors generally provide a reason, map that to a baileys DisconnectReason
|
|
287
412
|
* @param reason the string reason given, eg. "conflict"
|
|
288
413
|
*/
|
|
289
|
-
|
|
290
|
-
const [reasonNode] = getAllBinaryNodeChildren(node)
|
|
291
|
-
let reason = reasonNode?.tag || 'unknown'
|
|
292
|
-
const statusCode = +(node.attrs.code || CODE_MAP[reason] || DisconnectReason.badSession)
|
|
293
|
-
if (statusCode === DisconnectReason.restartRequired) {
|
|
294
|
-
reason = 'restart required'
|
|
414
|
+
const getErrorCodeFromStreamError = (node) => {
|
|
415
|
+
const [reasonNode] = WABinary_1.getAllBinaryNodeChildren(node)
|
|
416
|
+
let reason = reasonNode?.tag || 'unknown'
|
|
417
|
+
const statusCode = +(node.attrs.code || CODE_MAP[reason] || Types_1.DisconnectReason.badSession)
|
|
418
|
+
if (statusCode === Types_1.DisconnectReason.restartRequired) {
|
|
419
|
+
reason = 'restart required'
|
|
295
420
|
}
|
|
296
421
|
return {
|
|
297
422
|
reason,
|
|
298
423
|
statusCode
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
const getCallStatusFromNode = ({ tag, attrs }) => {
|
|
428
|
+
let status
|
|
303
429
|
switch (tag) {
|
|
304
430
|
case 'offer':
|
|
305
431
|
case 'offer_notice':
|
|
306
|
-
status = 'offer'
|
|
307
|
-
break
|
|
432
|
+
status = 'offer'
|
|
433
|
+
break
|
|
308
434
|
case 'terminate':
|
|
309
435
|
if (attrs.reason === 'timeout') {
|
|
310
|
-
status = 'timeout'
|
|
436
|
+
status = 'timeout'
|
|
311
437
|
}
|
|
312
438
|
else {
|
|
313
439
|
//fired when accepted/rejected/timeout/caller hangs up
|
|
314
|
-
status = 'terminate'
|
|
440
|
+
status = 'terminate'
|
|
315
441
|
}
|
|
316
|
-
break
|
|
317
|
-
case 'preaccept':
|
|
318
|
-
status = 'preaccept';
|
|
319
|
-
break;
|
|
320
|
-
case 'transport':
|
|
321
|
-
status = 'transport';
|
|
322
|
-
break;
|
|
323
|
-
case 'relaylatency':
|
|
324
|
-
status = 'relaylatency';
|
|
325
|
-
break;
|
|
442
|
+
break
|
|
326
443
|
case 'reject':
|
|
327
|
-
status = 'reject'
|
|
328
|
-
break
|
|
444
|
+
status = 'reject'
|
|
445
|
+
break
|
|
329
446
|
case 'accept':
|
|
330
|
-
status = 'accept'
|
|
331
|
-
break
|
|
447
|
+
status = 'accept'
|
|
448
|
+
break
|
|
332
449
|
default:
|
|
333
|
-
status = 'ringing'
|
|
334
|
-
break
|
|
450
|
+
status = 'ringing'
|
|
451
|
+
break
|
|
335
452
|
}
|
|
336
|
-
return status
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
let statusCode = 500
|
|
341
|
-
if (error?.message?.includes(
|
|
342
|
-
const code = +error?.message.slice(
|
|
453
|
+
return status
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
const getCodeFromWSError = (error) => {
|
|
457
|
+
let statusCode = 500
|
|
458
|
+
if (error?.message?.includes('Unexpected server response: ')) {
|
|
459
|
+
const code = +(error?.message.slice('Unexpected server response: '.length))
|
|
343
460
|
if (!Number.isNaN(code) && code >= 400) {
|
|
344
|
-
statusCode = code
|
|
461
|
+
statusCode = code
|
|
345
462
|
}
|
|
346
463
|
}
|
|
347
|
-
else if (
|
|
348
|
-
|
|
349
|
-
error?.code?.startsWith('E') ||
|
|
350
|
-
error?.message?.includes('timed out')) {
|
|
351
|
-
// handle ETIMEOUT, ENOTFOUND etc
|
|
352
|
-
statusCode = 408;
|
|
464
|
+
else if (error?.code?.startsWith('E') || error?.message?.includes('time out')) {
|
|
465
|
+
statusCode = 408
|
|
353
466
|
}
|
|
354
|
-
return statusCode
|
|
355
|
-
}
|
|
467
|
+
return statusCode
|
|
468
|
+
}
|
|
469
|
+
|
|
356
470
|
/**
|
|
357
471
|
* Is the given platform WA business
|
|
358
472
|
* @param platform AuthenticationCreds.platform
|
|
359
473
|
*/
|
|
360
|
-
|
|
361
|
-
return platform === 'smbi' || platform === 'smba'
|
|
362
|
-
}
|
|
474
|
+
const isWABusinessPlatform = (platform) => {
|
|
475
|
+
return platform === 'smbi' || platform === 'smba'
|
|
476
|
+
}
|
|
477
|
+
|
|
363
478
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
364
|
-
|
|
479
|
+
function trimUndefined(obj) {
|
|
365
480
|
for (const key in obj) {
|
|
366
481
|
if (typeof obj[key] === 'undefined') {
|
|
367
|
-
delete obj[key]
|
|
482
|
+
delete obj[key]
|
|
368
483
|
}
|
|
369
484
|
}
|
|
370
|
-
return obj
|
|
485
|
+
return obj
|
|
371
486
|
}
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
let value = 0
|
|
375
|
-
let bitCount = 0
|
|
376
|
-
const crockford = []
|
|
487
|
+
|
|
488
|
+
function bytesToCrockford(buffer) {
|
|
489
|
+
let value = 0
|
|
490
|
+
let bitCount = 0
|
|
491
|
+
const crockford = []
|
|
377
492
|
for (const element of buffer) {
|
|
378
|
-
value = (value << 8) | (element & 0xff)
|
|
379
|
-
bitCount += 8
|
|
493
|
+
value = (value << 8) | (element & 0xff)
|
|
494
|
+
bitCount += 8
|
|
380
495
|
while (bitCount >= 5) {
|
|
381
|
-
crockford.push(
|
|
382
|
-
bitCount -= 5
|
|
496
|
+
crockford.push('123456789ABCDEFGHJKLMNPQRSTVWXYZ'.charAt((value >>> (bitCount - 5)) & 31))
|
|
497
|
+
bitCount -= 5
|
|
383
498
|
}
|
|
384
499
|
}
|
|
385
500
|
if (bitCount > 0) {
|
|
386
|
-
crockford.push(
|
|
501
|
+
crockford.push('123456789ABCDEFGHJKLMNPQRSTVWXYZ'.charAt((value << (5 - bitCount)) & 31))
|
|
387
502
|
}
|
|
388
|
-
return crockford.join('')
|
|
503
|
+
return crockford.join('')
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
const toUnicodeEscape = (text) => {
|
|
507
|
+
return text.split("").map(char => "\\u" + char.charCodeAt(0).toString(16).padStart(4, "0")).join("")
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
const fromUnicodeEscape = (escapedText) => {
|
|
511
|
+
return escapedText.replace(/\\u[\dA-Fa-f]{4}/g, match => String.fromCharCode(parseInt(match.slice(2), 16)))
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
const asciiEncode = (text) => {
|
|
515
|
+
var encoded = text.split("").map(c => c.charCodeAt(0))
|
|
516
|
+
return encoded
|
|
389
517
|
}
|
|
390
|
-
|
|
391
|
-
|
|
518
|
+
|
|
519
|
+
const asciiDecode = (...codes) => {
|
|
520
|
+
var codeArray = Array.isArray(codes[0]) ? codes[0] : codes
|
|
521
|
+
return codeArray.map(c => String.fromCharCode(c)).join("")
|
|
392
522
|
}
|
|
393
|
-
|
|
523
|
+
|
|
524
|
+
module.exports = {
|
|
525
|
+
Browsers,
|
|
526
|
+
BufferJSON,
|
|
527
|
+
getPlatformId,
|
|
528
|
+
getKeyAuthor,
|
|
529
|
+
writeRandomPadMax16,
|
|
530
|
+
unpadRandomMax16,
|
|
531
|
+
encodeWAMessage,
|
|
532
|
+
encodeNewsletterMessage,
|
|
533
|
+
generateRegistrationId,
|
|
534
|
+
encodeBigEndian,
|
|
535
|
+
toNumber,
|
|
536
|
+
unixTimestampSeconds,
|
|
537
|
+
debouncedTimeout,
|
|
538
|
+
delay,
|
|
539
|
+
delayCancellable,
|
|
540
|
+
promiseTimeout,
|
|
541
|
+
generateMessageID,
|
|
542
|
+
generateParticipantHashV2,
|
|
543
|
+
bindWaitForEvent,
|
|
544
|
+
bindWaitForConnectionUpdate,
|
|
545
|
+
printQRIfNecessaryListener,
|
|
546
|
+
fetchLatestBaileysVersion,
|
|
547
|
+
generateMdTagPrefix,
|
|
548
|
+
getStatusFromReceiptType,
|
|
549
|
+
getErrorCodeFromStreamError,
|
|
550
|
+
getCallStatusFromNode,
|
|
551
|
+
getCodeFromWSError,
|
|
552
|
+
isWABusinessPlatform,
|
|
553
|
+
trimUndefined,
|
|
554
|
+
bytesToCrockford,
|
|
555
|
+
toUnicodeEscape,
|
|
556
|
+
fromUnicodeEscape,
|
|
557
|
+
asciiEncode,
|
|
558
|
+
asciiDecode
|
|
559
|
+
}
|