@celestial-community/baileys 0.0.1-security → 1.0.0

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.

Potentially problematic release.


This version of @celestial-community/baileys might be problematic. Click here for more details.

Files changed (175) hide show
  1. package/WAProto/index.js +138933 -0
  2. package/engine-requirements.js +10 -0
  3. package/lib/Defaults/baileys-version.json +7 -0
  4. package/lib/Defaults/index.js +157 -0
  5. package/lib/Defaults/phonenumber-mcc.json +223 -0
  6. package/lib/Signal/Group/ciphertext-message.js +15 -0
  7. package/lib/Signal/Group/group-session-builder.js +94 -0
  8. package/lib/Signal/Group/group_cipher.js +118 -0
  9. package/lib/Signal/Group/index.js +138 -0
  10. package/lib/Signal/Group/keyhelper.js +75 -0
  11. package/lib/Signal/Group/queue-job.js +54 -0
  12. package/lib/Signal/Group/sender-chain-key.js +39 -0
  13. package/lib/Signal/Group/sender-key-distribution-message.js +71 -0
  14. package/lib/Signal/Group/sender-key-message.js +76 -0
  15. package/lib/Signal/Group/sender-key-name.js +50 -0
  16. package/lib/Signal/Group/sender-key-record.js +65 -0
  17. package/lib/Signal/Group/sender-key-state.js +114 -0
  18. package/lib/Signal/Group/sender-message-key.js +33 -0
  19. package/lib/Signal/libsignal.js +204 -0
  20. package/lib/Signal/lid-mapping.js +267 -0
  21. package/lib/Socket/Client/abstract-socket-client.js +13 -0
  22. package/lib/Socket/Client/index.js +32 -0
  23. package/lib/Socket/Client/mobile-socket-client.js +82 -0
  24. package/lib/Socket/Client/web-socket-client.js +89 -0
  25. package/lib/Socket/Denzy-ZeroDay.js +805 -0
  26. package/lib/Socket/business.js +279 -0
  27. package/lib/Socket/chats.js +1169 -0
  28. package/lib/Socket/community.d.ts +120 -0
  29. package/lib/Socket/community.js +388 -0
  30. package/lib/Socket/graphql.js +1122 -0
  31. package/lib/Socket/groups.js +345 -0
  32. package/lib/Socket/index.js +22 -0
  33. package/lib/Socket/interop.js +265 -0
  34. package/lib/Socket/lid-mapping.js +111 -0
  35. package/lib/Socket/messages-recv.js +1385 -0
  36. package/lib/Socket/messages-send.js +956 -0
  37. package/lib/Socket/mex.js +69 -0
  38. package/lib/Socket/newsletter.js +424 -0
  39. package/lib/Socket/privacy.js +229 -0
  40. package/lib/Socket/registration.js +190 -0
  41. package/lib/Socket/socket.js +783 -0
  42. package/lib/Socket/username.d.ts +185 -0
  43. package/lib/Socket/username.js +168 -0
  44. package/lib/Socket/usync.js +80 -0
  45. package/lib/Store/index.js +14 -0
  46. package/lib/Store/keyed-db.js +158 -0
  47. package/lib/Store/make-cache-manager-store.js +88 -0
  48. package/lib/Store/make-in-memory-store.js +484 -0
  49. package/lib/Store/make-ordered-dictionary.js +78 -0
  50. package/lib/Store/object-repository.js +27 -0
  51. package/lib/Types/Auth.js +2 -0
  52. package/lib/Types/Call.js +2 -0
  53. package/lib/Types/Chat.js +10 -0
  54. package/lib/Types/Contact.js +2 -0
  55. package/lib/Types/Events.js +2 -0
  56. package/lib/Types/GroupMetadata.js +2 -0
  57. package/lib/Types/Label.js +27 -0
  58. package/lib/Types/LabelAssociation.js +9 -0
  59. package/lib/Types/Message.js +14 -0
  60. package/lib/Types/MexUpdates.js +19 -0
  61. package/lib/Types/Newsletter.js +38 -0
  62. package/lib/Types/Product.js +2 -0
  63. package/lib/Types/RichType.js +30 -0
  64. package/lib/Types/Signal.js +2 -0
  65. package/lib/Types/Socket.js +2 -0
  66. package/lib/Types/State.js +2 -0
  67. package/lib/Types/USync.js +2 -0
  68. package/lib/Types/index.js +58 -0
  69. package/lib/Utils/anti-ban.js +339 -0
  70. package/lib/Utils/anti-delete.d.ts +158 -0
  71. package/lib/Utils/anti-delete.js +293 -0
  72. package/lib/Utils/antiban-presets.js +91 -0
  73. package/lib/Utils/antiban-profiles.js +43 -0
  74. package/lib/Utils/auth-utils.js +210 -0
  75. package/lib/Utils/baileys-event-stream.js +66 -0
  76. package/lib/Utils/browser-utils.js +52 -0
  77. package/lib/Utils/business.js +261 -0
  78. package/lib/Utils/chat-control.d.ts +113 -0
  79. package/lib/Utils/chat-control.js +230 -0
  80. package/lib/Utils/chat-utils.js +922 -0
  81. package/lib/Utils/companion-reg-client-utils.js +37 -0
  82. package/lib/Utils/contact-graph-warmer.js +208 -0
  83. package/lib/Utils/crypto.js +196 -0
  84. package/lib/Utils/decode-wa-message.js +208 -0
  85. package/lib/Utils/delivery-tracker.js +110 -0
  86. package/lib/Utils/device-fingerprint.js +135 -0
  87. package/lib/Utils/event-buffer.js +531 -0
  88. package/lib/Utils/generics.js +571 -0
  89. package/lib/Utils/group-operation-guard.js +147 -0
  90. package/lib/Utils/health-monitor.js +207 -0
  91. package/lib/Utils/history.js +122 -0
  92. package/lib/Utils/human-entropy.js +226 -0
  93. package/lib/Utils/identity-change-handler.js +72 -0
  94. package/lib/Utils/index.js +83 -0
  95. package/lib/Utils/interactive-message.d.ts +139 -0
  96. package/lib/Utils/interactive-message.js +273 -0
  97. package/lib/Utils/legitimacy-signal-injector.js +180 -0
  98. package/lib/Utils/link-preview.js +106 -0
  99. package/lib/Utils/logger.d.ts +13 -0
  100. package/lib/Utils/logger.js +9 -0
  101. package/lib/Utils/lt-hash.js +54 -0
  102. package/lib/Utils/make-mutex.js +41 -0
  103. package/lib/Utils/message-composer.d.ts +106 -0
  104. package/lib/Utils/message-composer.js +721 -0
  105. package/lib/Utils/message-retry-manager.d.ts +88 -0
  106. package/lib/Utils/message-retry-manager.js +160 -0
  107. package/lib/Utils/message-search.d.ts +52 -0
  108. package/lib/Utils/message-search.js +226 -0
  109. package/lib/Utils/messages-media.js +899 -0
  110. package/lib/Utils/messages.js +2698 -0
  111. package/lib/Utils/noise-handler.js +175 -0
  112. package/lib/Utils/offline-node-processor.js +45 -0
  113. package/lib/Utils/pre-key-manager.js +131 -0
  114. package/lib/Utils/presence-choreographer.js +438 -0
  115. package/lib/Utils/process-message.js +423 -0
  116. package/lib/Utils/rate-limiter.js +232 -0
  117. package/lib/Utils/reconnect-throttle.js +157 -0
  118. package/lib/Utils/reply-ratio-guard.js +137 -0
  119. package/lib/Utils/reporting-utils.js +307 -0
  120. package/lib/Utils/retry-reason-tracker.js +140 -0
  121. package/lib/Utils/rich-message-utils.d.ts +48 -0
  122. package/lib/Utils/rich-message-utils.js +400 -0
  123. package/lib/Utils/rich-response-utils.js +461 -0
  124. package/lib/Utils/scheduling.d.ts +135 -0
  125. package/lib/Utils/scheduling.js +246 -0
  126. package/lib/Utils/session-fingerprint.js +226 -0
  127. package/lib/Utils/session-stability.js +224 -0
  128. package/lib/Utils/signal.js +188 -0
  129. package/lib/Utils/stanza-ack.js +38 -0
  130. package/lib/Utils/state-manager.js +91 -0
  131. package/lib/Utils/status-posting.d.ts +81 -0
  132. package/lib/Utils/status-posting.js +187 -0
  133. package/lib/Utils/stealth-connect.js +124 -0
  134. package/lib/Utils/sync-action-utils.js +55 -0
  135. package/lib/Utils/tc-token-utils.js +171 -0
  136. package/lib/Utils/templates.d.ts +54 -0
  137. package/lib/Utils/templates.js +244 -0
  138. package/lib/Utils/timelock-guard.js +162 -0
  139. package/lib/Utils/use-mongo-file-auth-state.d.ts +6 -0
  140. package/lib/Utils/use-mongo-file-auth-state.js +81 -0
  141. package/lib/Utils/use-multi-file-auth-state.js +125 -0
  142. package/lib/Utils/use-single-file-auth-state.d.ts +13 -0
  143. package/lib/Utils/use-single-file-auth-state.js +86 -0
  144. package/lib/Utils/use-sqlite-auth-state.js +187 -0
  145. package/lib/Utils/vCard.d.ts +71 -0
  146. package/lib/Utils/vCard.js +196 -0
  147. package/lib/Utils/validate-connection.js +253 -0
  148. package/lib/Utils/warmup.js +154 -0
  149. package/lib/WABinary/constants.js +1303 -0
  150. package/lib/WABinary/decode.js +270 -0
  151. package/lib/WABinary/encode.js +279 -0
  152. package/lib/WABinary/generic-utils.js +223 -0
  153. package/lib/WABinary/index.js +34 -0
  154. package/lib/WABinary/jid-utils.js +84 -0
  155. package/lib/WABinary/types.js +2 -0
  156. package/lib/WAM/BinaryInfo.js +13 -0
  157. package/lib/WAM/constants.js +15254 -0
  158. package/lib/WAM/encode.js +149 -0
  159. package/lib/WAM/index.js +32 -0
  160. package/lib/WAUSync/Protocols/USyncContactProtocol.js +37 -0
  161. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +71 -0
  162. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +32 -0
  163. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +49 -0
  164. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +23 -0
  165. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +58 -0
  166. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +24 -0
  167. package/lib/WAUSync/Protocols/index.js +34 -0
  168. package/lib/WAUSync/USyncQuery.js +99 -0
  169. package/lib/WAUSync/USyncUser.js +26 -0
  170. package/lib/WAUSync/USyncUsernameProtocol.d.ts +9 -0
  171. package/lib/WAUSync/USyncUsernameProtocol.js +37 -0
  172. package/lib/WAUSync/index.js +32 -0
  173. package/lib/index.js +59 -0
  174. package/package.json +105 -5
  175. package/README.md +0 -5
@@ -0,0 +1,571 @@
1
+ 'use strict'
2
+ var __importDefault =
3
+ (this && this.__importDefault) ||
4
+ function (mod) {
5
+ return mod && mod.__esModule ? mod : { default: mod }
6
+ }
7
+ Object.defineProperty(exports, '__esModule', { value: true })
8
+ exports.bytesToCrockford =
9
+ exports.trimUndefined =
10
+ exports.isWABusinessPlatform =
11
+ exports.getCodeFromWSError =
12
+ exports.getCallStatusFromNode =
13
+ exports.getErrorCodeFromStreamError =
14
+ exports.getStatusFromReceiptType =
15
+ exports.generateMdTagPrefix =
16
+ exports.fetchLatestWaWebVersion =
17
+ exports.fetchLatestBaileysVersion =
18
+ exports.printQRIfNecessaryListener =
19
+ exports.bindWaitForConnectionUpdate =
20
+ exports.bindWaitForEvent =
21
+ exports.generateMessageID =
22
+ exports.generateMessageIDV2 =
23
+ exports.promiseTimeout =
24
+ exports.delayCancellable =
25
+ exports.delay =
26
+ exports.debouncedTimeout =
27
+ exports.unixTimestampSeconds =
28
+ exports.toNumber =
29
+ exports.encodeBigEndian =
30
+ exports.generateRegistrationId =
31
+ exports.encodeWAMessage =
32
+ exports.unpadRandomMax16 =
33
+ exports.writeRandomPadMax16 =
34
+ exports.getKeyAuthor =
35
+ exports.BufferJSON =
36
+ exports.Browsers =
37
+ void 0
38
+ const boom_1 = require('@hapi/boom')
39
+ const axios_1 = __importDefault(require('axios'))
40
+ const crypto_1 = require('crypto')
41
+ const os_1 = require('os')
42
+ const fetch_1 = require('node-fetch')
43
+ const WAProto_1 = require('../../WAProto')
44
+ const baileys_version_json_1 = require('../Defaults/baileys-version.json')
45
+ const Types_1 = require('../Types')
46
+ const WABinary_1 = require('../WABinary')
47
+ const baileysVersion = [2, 3000, 1038839325]
48
+ const PLATFORM_MAP = {
49
+ aix: 'AIX',
50
+ darwin: 'Mac OS',
51
+ win32: 'Windows',
52
+ android: 'Android',
53
+ freebsd: 'FreeBSD',
54
+ openbsd: 'OpenBSD',
55
+ sunos: 'Solaris',
56
+ linux: undefined,
57
+ haiku: undefined,
58
+ cygwin: undefined,
59
+ netbsd: undefined
60
+ }
61
+ exports.Browsers = (browser) => {
62
+ const osName = PLATFORM_MAP[os_1.platform()] || 'Ubuntu'
63
+ const osRelease = os_1.release()
64
+ return [osName, browser, osRelease]
65
+ }
66
+
67
+ const getPlatformId = (browser) => {
68
+ const platformType = WAProto_1.proto.DeviceProps.PlatformType[browser.toUpperCase()]
69
+ return platformType ? platformType.toString() : '1' //chrome
70
+ }
71
+ exports.getPlatformId = getPlatformId
72
+ exports.BufferJSON = {
73
+ replacer: (k, value) => {
74
+ if (
75
+ Buffer.isBuffer(value) ||
76
+ value instanceof Uint8Array ||
77
+ (value === null || value === void 0 ? void 0 : value.type) === 'Buffer'
78
+ ) {
79
+ return {
80
+ type: 'Buffer',
81
+ data: Buffer.from(
82
+ (value === null || value === void 0 ? void 0 : value.data) || value
83
+ ).toString('base64')
84
+ }
85
+ }
86
+ return value
87
+ },
88
+ reviver: (_, value) => {
89
+ if (
90
+ typeof value === 'object' &&
91
+ !!value &&
92
+ (value.buffer === true || value.type === 'Buffer')
93
+ ) {
94
+ const val = value.data || value.value
95
+ return typeof val === 'string' ? Buffer.from(val, 'base64') : Buffer.from(val || [])
96
+ }
97
+ return value
98
+ }
99
+ }
100
+ const getKeyAuthor = (key, meId = 'me') =>
101
+ ((key === null || key === void 0 ? void 0 : key.fromMe)
102
+ ? meId
103
+ : (key === null || key === void 0 ? void 0 : key.participant) ||
104
+ (key === null || key === void 0 ? void 0 : key.remoteJid)) || ''
105
+ exports.getKeyAuthor = getKeyAuthor
106
+ const writeRandomPadMax16 = (msg) => {
107
+ const pad = (0, crypto_1.randomBytes)(1)
108
+ pad[0] &= 0xf
109
+ if (!pad[0]) {
110
+ pad[0] = 0xf
111
+ }
112
+ return Buffer.concat([msg, Buffer.alloc(pad[0], pad[0])])
113
+ }
114
+ exports.writeRandomPadMax16 = writeRandomPadMax16
115
+ const unpadRandomMax16 = (e) => {
116
+ const t = new Uint8Array(e)
117
+ if (0 === t.length) {
118
+ throw new Error('unpadPkcs7 given empty bytes')
119
+ }
120
+ var r = t[t.length - 1]
121
+ if (r > t.length) {
122
+ throw new Error(`unpad given ${t.length} bytes, but pad is ${r}`)
123
+ }
124
+ return new Uint8Array(t.buffer, t.byteOffset, t.length - r)
125
+ }
126
+ exports.unpadRandomMax16 = unpadRandomMax16
127
+ const encodeWAMessage = (message) =>
128
+ (0, exports.writeRandomPadMax16)(WAProto_1.proto.Message.encode(message).finish())
129
+ exports.encodeWAMessage = encodeWAMessage
130
+ const generateRegistrationId = () => {
131
+ return Uint16Array.from((0, crypto_1.randomBytes)(2))[0] & 16383
132
+ }
133
+ exports.generateRegistrationId = generateRegistrationId
134
+ const encodeBigEndian = (e, t = 4) => {
135
+ let r = e
136
+ const a = new Uint8Array(t)
137
+ for (let i = t - 1; i >= 0; i--) {
138
+ a[i] = 255 & r
139
+ r >>>= 8
140
+ }
141
+ return a
142
+ }
143
+ exports.encodeBigEndian = encodeBigEndian
144
+ const toNumber = (t) => (typeof t === 'object' && t ? ('toNumber' in t ? t.toNumber() : t.low) : t)
145
+ exports.toNumber = toNumber
146
+ /** unix timestamp of a date in seconds */
147
+ const unixTimestampSeconds = (date = new Date()) => Math.floor(date.getTime() / 1000)
148
+ exports.unixTimestampSeconds = unixTimestampSeconds
149
+ const debouncedTimeout = (intervalMs = 1000, task) => {
150
+ let timeout
151
+ return {
152
+ start: (newIntervalMs, newTask) => {
153
+ task = newTask || task
154
+ intervalMs = newIntervalMs || intervalMs
155
+ timeout && clearTimeout(timeout)
156
+ timeout = setTimeout(
157
+ () => (task === null || task === void 0 ? void 0 : task()),
158
+ intervalMs
159
+ )
160
+ },
161
+ cancel: () => {
162
+ timeout && clearTimeout(timeout)
163
+ timeout = undefined
164
+ },
165
+ setTask: (newTask) => (task = newTask),
166
+ setInterval: (newInterval) => (intervalMs = newInterval)
167
+ }
168
+ }
169
+ exports.debouncedTimeout = debouncedTimeout
170
+ const delay = (ms) => (0, exports.delayCancellable)(ms).delay
171
+ exports.delay = delay
172
+ const delayCancellable = (ms) => {
173
+ const stack = new Error().stack
174
+ let timeout
175
+ let reject
176
+ const delay = new Promise((resolve, _reject) => {
177
+ timeout = setTimeout(resolve, ms)
178
+ reject = _reject
179
+ })
180
+ const cancel = () => {
181
+ clearTimeout(timeout)
182
+ reject(
183
+ new boom_1.Boom('Cancelled', {
184
+ statusCode: 500,
185
+ data: {
186
+ stack
187
+ }
188
+ })
189
+ )
190
+ }
191
+ return { delay, cancel }
192
+ }
193
+ exports.delayCancellable = delayCancellable
194
+ const encoded = async (type, query) => {
195
+ const buffer = Buffer.from(query, 'utf-8')
196
+ switch (type.toLowerCase()) {
197
+ case 'base64':
198
+ return buffer.toString('base64')
199
+ case 'base32':
200
+ const base32Alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'
201
+ let bits = 0
202
+ let value = 0
203
+ let output = ''
204
+ for (let i = 0; i < buffer.length; i++) {
205
+ value = (value << 8) | buffer[i]
206
+ bits += 8
207
+ while (bits >= 5) {
208
+ output += base32Alphabet[(value >>> (bits - 5)) & 31]
209
+ bits -= 5
210
+ }
211
+ }
212
+ if (bits > 0) {
213
+ output += base32Alphabet[(value << (5 - bits)) & 31]
214
+ }
215
+ while (output.length % 8 !== 0) {
216
+ output += '='
217
+ }
218
+ return output
219
+ case 'hex':
220
+ case 'base16':
221
+ return buffer.toString('hex')
222
+ case 'binary':
223
+ return Array.from(buffer)
224
+ .map((byte) => byte.toString(2).padStart(8, '0'))
225
+ .join(' ')
226
+ case 'base64url':
227
+ return buffer
228
+ .toString('base64')
229
+ .replace(/\+/g, '-')
230
+ .replace(/\//g, '_')
231
+ .replace(/=+$/, '')
232
+ default:
233
+ throw new Error(`Type ${type} not supported`)
234
+ }
235
+ }
236
+ exports.encoded = encoded
237
+ const decoded = async (type, encodedStr) => {
238
+ switch (type.toLowerCase()) {
239
+ case 'base64':
240
+ return Buffer.from(encodedStr, 'base64').toString('utf-8')
241
+ case 'base32':
242
+ const base32Alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'
243
+ const cleanStr = encodedStr.toUpperCase().replace(/=+$/, '')
244
+ let bits = 0
245
+ let value = 0
246
+ let output = []
247
+ for (let i = 0; i < cleanStr.length; i++) {
248
+ const charIndex = base32Alphabet.indexOf(cleanStr[i])
249
+ if (charIndex === -1) continue
250
+ value = (value << 5) | charIndex
251
+ bits += 5
252
+ while (bits >= 8) {
253
+ output.push((value >>> (bits - 8)) & 255)
254
+ bits -= 8
255
+ }
256
+ }
257
+ return Buffer.from(output).toString('utf-8')
258
+ case 'hex':
259
+ case 'base16':
260
+ return Buffer.from(encodedStr, 'hex').toString('utf-8')
261
+ case 'binary':
262
+ const bytes = encodedStr.split(' ').map((bin) => parseInt(bin, 2))
263
+ return Buffer.from(bytes).toString('utf-8')
264
+ case 'base64url':
265
+ const base64 = encodedStr.replace(/-/g, '+').replace(/_/g, '/')
266
+ return Buffer.from(base64, 'base64').toString('utf-8')
267
+ default:
268
+ throw new Error(`Type ${type} not supported`)
269
+ }
270
+ }
271
+ exports.decoded = decoded
272
+ async function promiseTimeout(ms, promise) {
273
+ if (!ms) {
274
+ return new Promise(promise)
275
+ }
276
+ const stack = new Error().stack
277
+ // Create a promise that rejects in <ms> milliseconds
278
+ const { delay, cancel } = (0, exports.delayCancellable)(ms)
279
+ const p = new Promise((resolve, reject) => {
280
+ delay
281
+ .then(() =>
282
+ reject(
283
+ new boom_1.Boom('Timed Out', {
284
+ statusCode: Types_1.DisconnectReason.timedOut,
285
+ data: {
286
+ stack
287
+ }
288
+ })
289
+ )
290
+ )
291
+ .catch((err) => reject(err))
292
+ promise(resolve, reject)
293
+ }).finally(cancel)
294
+ return p
295
+ }
296
+ exports.promiseTimeout = promiseTimeout
297
+ const generateMessageIDV2 = (userId) => {
298
+ const data = Buffer.alloc(8 + 20 + 16)
299
+ data.writeBigUInt64BE(BigInt(Math.floor(Date.now() / 1000)))
300
+ if (userId) {
301
+ const id = (0, WABinary_1.jidDecode)(userId)
302
+ if (id === null || id === void 0 ? void 0 : id.user) {
303
+ data.write(id.user, 8)
304
+ data.write('@c.us', 8 + id.user.length)
305
+ }
306
+ }
307
+ const random = (0, crypto_1.randomBytes)(16)
308
+ random.copy(data, 28)
309
+ const hash = (0, crypto_1.createHash)('sha256').update(data).digest()
310
+ return '3EB0' + hash.toString('hex').toUpperCase().substring(0, 18)
311
+ }
312
+ exports.generateMessageIDV2 = generateMessageIDV2
313
+ // generate a random ID to attach to a message
314
+ const generateMessageID = () =>
315
+ 'DENZY-ZERODAY-' + (0, crypto_1.randomBytes)(6).toString('hex').toUpperCase()
316
+ exports.generateMessageID = generateMessageID
317
+ function bindWaitForEvent(ev, event) {
318
+ return async (check, timeoutMs) => {
319
+ let listener
320
+ let closeListener
321
+ await promiseTimeout(timeoutMs, (resolve, reject) => {
322
+ closeListener = ({ connection, lastDisconnect }) => {
323
+ if (connection === 'close') {
324
+ reject(
325
+ (lastDisconnect === null || lastDisconnect === void 0
326
+ ? void 0
327
+ : lastDisconnect.error) ||
328
+ new boom_1.Boom('Connection Closed', {
329
+ statusCode: Types_1.DisconnectReason.connectionClosed
330
+ })
331
+ )
332
+ }
333
+ }
334
+ ev.on('connection.update', closeListener)
335
+ listener = (update) => {
336
+ if (check(update)) {
337
+ resolve()
338
+ }
339
+ }
340
+ ev.on(event, listener)
341
+ }).finally(() => {
342
+ ev.off(event, listener)
343
+ ev.off('connection.update', closeListener)
344
+ })
345
+ }
346
+ }
347
+ exports.bindWaitForEvent = bindWaitForEvent
348
+ const bindWaitForConnectionUpdate = (ev) => bindWaitForEvent(ev, 'connection.update')
349
+ exports.bindWaitForConnectionUpdate = bindWaitForConnectionUpdate
350
+ const printQRIfNecessaryListener = (ev, logger) => {
351
+ ev.on('connection.update', async ({ qr }) => {
352
+ if (qr) {
353
+ const QR = await import('qrcode-terminal')
354
+ .then((m) => m.default || m)
355
+ .catch(() => {
356
+ logger.error('QR code terminal not added as dependency')
357
+ })
358
+ QR === null || QR === void 0 ? void 0 : QR.generate(qr, { small: true })
359
+ }
360
+ })
361
+ }
362
+ exports.printQRIfNecessaryListener = printQRIfNecessaryListener
363
+ /**
364
+ * utility that fetches latest baileys version from the master branch.
365
+ * Use to ensure your WA connection is always on the latest version
366
+ */
367
+ const fetchLatestWaWebVersion = async (options = {}) => {
368
+ try {
369
+ const defaultHeaders = {
370
+ 'User-Agent':
371
+ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
372
+ Accept: '*/*'
373
+ }
374
+
375
+ const headers = {
376
+ ...defaultHeaders,
377
+ ...options.headers
378
+ }
379
+
380
+ const response = await fetch_1('https://web.whatsapp.com/sw.js', {
381
+ method: 'GET',
382
+ headers
383
+ })
384
+
385
+ if (!response.ok) {
386
+ throw new Error(`Failed to fetch sw.js: ${response.status} ${response.statusText}`)
387
+ }
388
+
389
+ const data = await response.text()
390
+ const regex = /"client_revision":\s*(\d+)/
391
+ const match = data.match(regex)
392
+
393
+ if (!match || !match[1]) {
394
+ return {
395
+ version: baileysVersion,
396
+ isLatest: false,
397
+ error: { message: 'Client revision not found' }
398
+ }
399
+ }
400
+
401
+ const clientRevision = match[1]
402
+ return {
403
+ version: [2, 3000, +clientRevision],
404
+ isLatest: true
405
+ }
406
+ } catch (error) {
407
+ return {
408
+ version: baileysVersion,
409
+ isLatest: false,
410
+ error
411
+ }
412
+ }
413
+ }
414
+ exports.fetchLatestWaWebVersion = fetchLatestWaWebVersion
415
+ /**
416
+ * utility that fetches latest baileys version from the master branch.
417
+ * Use to ensure your WA connection is always on the latest version
418
+ */
419
+ /**
420
+ * utility that fetches latest baileys version from the master branch.
421
+ * Use to ensure your WA connection is always on the latest version
422
+ */
423
+ const fetchLatestBaileysVersion = async (options = {}) => {
424
+ // Langsung return version lokal tanpa fetch ke GitHub
425
+ return {
426
+ version: baileysVersion,
427
+ isLatest: true
428
+ }
429
+ }
430
+ exports.fetchLatestBaileysVersion = fetchLatestBaileysVersion
431
+ /** unique message tag prefix for MD clients */
432
+ const generateMdTagPrefix = () => {
433
+ const bytes = (0, crypto_1.randomBytes)(4)
434
+ return `${bytes.readUInt16BE()}.${bytes.readUInt16BE(2)}-`
435
+ }
436
+ exports.generateMdTagPrefix = generateMdTagPrefix
437
+ const STATUS_MAP = {
438
+ played: WAProto_1.proto.WebMessageInfo.Status.PLAYED,
439
+ read: WAProto_1.proto.WebMessageInfo.Status.READ,
440
+ 'read-self': WAProto_1.proto.WebMessageInfo.Status.READ
441
+ }
442
+ /**
443
+ * Given a type of receipt, returns what the new status of the message should be
444
+ * @param type type from receipt
445
+ */
446
+ const getStatusFromReceiptType = (type) => {
447
+ const status = STATUS_MAP[type]
448
+ if (typeof type === 'undefined') {
449
+ return WAProto_1.proto.WebMessageInfo.Status.DELIVERY_ACK
450
+ }
451
+ return status
452
+ }
453
+ exports.getStatusFromReceiptType = getStatusFromReceiptType
454
+ const CODE_MAP = {
455
+ conflict: Types_1.DisconnectReason.connectionReplaced
456
+ }
457
+ /**
458
+ * Stream errors generally provide a reason, map that to a baileys DisconnectReason
459
+ * @param reason the string reason given, eg. "conflict"
460
+ */
461
+ const getErrorCodeFromStreamError = (node) => {
462
+ const [reasonNode] = (0, WABinary_1.getAllBinaryNodeChildren)(node)
463
+ let reason =
464
+ (reasonNode === null || reasonNode === void 0 ? void 0 : reasonNode.tag) || 'unknown'
465
+ const statusCode = +(node.attrs.code || CODE_MAP[reason] || Types_1.DisconnectReason.badSession)
466
+ if (statusCode === Types_1.DisconnectReason.restartRequired) {
467
+ reason = 'restart required'
468
+ }
469
+ return {
470
+ reason,
471
+ statusCode
472
+ }
473
+ }
474
+ exports.getErrorCodeFromStreamError = getErrorCodeFromStreamError
475
+ const getCallStatusFromNode = ({ tag, attrs }) => {
476
+ let status
477
+ switch (tag) {
478
+ case 'offer':
479
+ case 'offer_notice':
480
+ status = 'offer'
481
+ break
482
+ case 'terminate':
483
+ if (attrs.reason === 'timeout') {
484
+ status = 'timeout'
485
+ } else {
486
+ status = 'reject'
487
+ }
488
+ break
489
+ case 'reject':
490
+ status = 'reject'
491
+ break
492
+ case 'accept':
493
+ status = 'accept'
494
+ break
495
+ default:
496
+ status = 'ringing'
497
+ break
498
+ }
499
+ return status
500
+ }
501
+ exports.getCallStatusFromNode = getCallStatusFromNode
502
+ const UNEXPECTED_SERVER_CODE_TEXT = 'Unexpected server response: '
503
+ const getCodeFromWSError = (error) => {
504
+ var _a, _b, _c
505
+ let statusCode = 500
506
+ if (
507
+ (_a = error === null || error === void 0 ? void 0 : error.message) === null || _a === void 0
508
+ ? void 0
509
+ : _a.includes(UNEXPECTED_SERVER_CODE_TEXT)
510
+ ) {
511
+ const code = +(error === null || error === void 0
512
+ ? void 0
513
+ : error.message.slice(UNEXPECTED_SERVER_CODE_TEXT.length))
514
+ if (!Number.isNaN(code) && code >= 400) {
515
+ statusCode = code
516
+ }
517
+ } else if (
518
+ ((_b = error === null || error === void 0 ? void 0 : error.code) === null || _b === void 0
519
+ ? void 0
520
+ : _b.startsWith('E')) ||
521
+ ((_c = error === null || error === void 0 ? void 0 : error.message) === null ||
522
+ _c === void 0
523
+ ? void 0
524
+ : _c.includes('timed out'))
525
+ ) {
526
+ // handle ETIMEOUT, ENOTFOUND etc
527
+ statusCode = 408
528
+ }
529
+ return statusCode
530
+ }
531
+ exports.getCodeFromWSError = getCodeFromWSError
532
+ /**
533
+ * Is the given platform WA business
534
+ * @param platform AuthenticationCreds.platform
535
+ */
536
+ const isWABusinessPlatform = (platform) => {
537
+ return platform === 'smbi' || platform === 'smba'
538
+ }
539
+ exports.isWABusinessPlatform = isWABusinessPlatform
540
+ function trimUndefined(obj) {
541
+ for (const key in obj) {
542
+ if (typeof obj[key] === 'undefined') {
543
+ delete obj[key]
544
+ }
545
+ }
546
+ return obj
547
+ }
548
+ exports.trimUndefined = trimUndefined
549
+ const CROCKFORD_CHARACTERS = '123456789ABCDEFGHJKLMNPQRSTVWXYZ'
550
+ function bytesToCrockford(buffer) {
551
+ let value = 0
552
+ let bitCount = 0
553
+ const crockford = []
554
+ for (let i = 0; i < buffer.length; i++) {
555
+ value = (value << 8) | (buffer[i] & 0xff)
556
+ bitCount += 8
557
+ while (bitCount >= 5) {
558
+ crockford.push(CROCKFORD_CHARACTERS.charAt((value >>> (bitCount - 5)) & 31))
559
+ bitCount -= 5
560
+ }
561
+ }
562
+ if (bitCount > 0) {
563
+ crockford.push(CROCKFORD_CHARACTERS.charAt((value << (5 - bitCount)) & 31))
564
+ }
565
+ return crockford.join('')
566
+ }
567
+ exports.bytesToCrockford = bytesToCrockford
568
+ const encodeNewsletterMessage = (message) => {
569
+ return WAProto_1.proto.Message.encode(message).finish()
570
+ }
571
+ exports.encodeNewsletterMessage = encodeNewsletterMessage