@badzz88/baileys 8.4.7 → 8.5.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.
Files changed (144) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1055 -337
  3. package/WAProto/index.js +5 -5
  4. package/lib/Defaults/index.js +187 -127
  5. package/lib/Defaults/phonenumber-mcc.json +223 -0
  6. package/lib/Signal/Group/ciphertext-message.js +14 -11
  7. package/lib/Signal/Group/group-session-builder.js +91 -29
  8. package/lib/Signal/Group/group_cipher.js +88 -81
  9. package/lib/Signal/Group/index.js +136 -12
  10. package/lib/Signal/Group/keyhelper.js +70 -15
  11. package/lib/Signal/Group/sender-chain-key.js +31 -25
  12. package/lib/Signal/Group/sender-key-distribution-message.js +65 -62
  13. package/lib/Signal/Group/sender-key-message.js +68 -65
  14. package/lib/Signal/Group/sender-key-name.js +43 -41
  15. package/lib/Signal/Group/sender-key-record.js +43 -40
  16. package/lib/Signal/Group/sender-key-state.js +96 -83
  17. package/lib/Signal/Group/sender-message-key.js +29 -25
  18. package/lib/Signal/libsignal.js +483 -424
  19. package/lib/Signal/lid-mapping.js +261 -276
  20. package/lib/Socket/Client/index.js +30 -3
  21. package/lib/Socket/Client/types.js +12 -10
  22. package/lib/Socket/Client/websocket.js +61 -53
  23. package/lib/Socket/aigroups.js +240 -0
  24. package/lib/Socket/business.js +422 -379
  25. package/lib/Socket/chats.js +1816 -1193
  26. package/lib/Socket/communities.js +549 -431
  27. package/lib/Socket/graphql.js +656 -0
  28. package/lib/Socket/groups.js +764 -374
  29. package/lib/Socket/index.js +38 -11
  30. package/lib/Socket/interactive-handler.js +522 -0
  31. package/lib/Socket/interop.js +549 -0
  32. package/lib/Socket/luxu.js +6 -5
  33. package/lib/Socket/managed-account.js +183 -0
  34. package/lib/Socket/messages-recv.js +2439 -1915
  35. package/lib/Socket/messages-send.js +1642 -1242
  36. package/lib/Socket/mex.js +59 -40
  37. package/lib/Socket/newsletter.js +812 -249
  38. package/lib/Socket/privacy.js +449 -0
  39. package/lib/Socket/registration.js +427 -0
  40. package/lib/Socket/socket.js +1077 -965
  41. package/lib/Socket/text-router.js +83 -0
  42. package/lib/Socket/username.js +237 -140
  43. package/lib/Store/index.js +36 -10
  44. package/lib/Store/make-cache-manager-store.js +85 -80
  45. package/lib/Store/make-in-memory-store.js +591 -185
  46. package/lib/Store/make-ordered-dictionary.js +78 -72
  47. package/lib/Store/object-repository.js +25 -28
  48. package/lib/Types/Auth.js +38 -2
  49. package/lib/Types/Bussines.js +2 -2
  50. package/lib/Types/Call.js +2 -2
  51. package/lib/Types/Chat.js +4 -8
  52. package/lib/Types/Contact.js +2 -2
  53. package/lib/Types/Events.js +2 -2
  54. package/lib/Types/GroupMetadata.js +2 -2
  55. package/lib/Types/Label.js +26 -24
  56. package/lib/Types/LabelAssociation.js +8 -6
  57. package/lib/Types/Message.js +95 -11
  58. package/lib/Types/Mex.js +112 -37
  59. package/lib/Types/Newsletter.js +121 -0
  60. package/lib/Types/Product.js +2 -2
  61. package/lib/Types/Signal.js +2 -2
  62. package/lib/Types/Socket.js +2 -3
  63. package/lib/Types/State.js +70 -56
  64. package/lib/Types/USync.js +2 -2
  65. package/lib/Types/index.js +55 -26
  66. package/lib/Utils/auth-utils.js +292 -288
  67. package/lib/Utils/browser-utils.js +113 -48
  68. package/lib/Utils/business.js +240 -224
  69. package/lib/Utils/chat-utils.js +1205 -869
  70. package/lib/Utils/command-loader.d.ts +31 -0
  71. package/lib/Utils/command-loader.js +100 -0
  72. package/lib/Utils/companion-reg-client-utils.js +41 -34
  73. package/lib/Utils/consumer-application.js +107 -0
  74. package/lib/Utils/crypto.js +144 -107
  75. package/lib/Utils/curve25519-js.js +275 -0
  76. package/lib/Utils/decode-wa-message.js +518 -308
  77. package/lib/Utils/event-buffer.js +596 -611
  78. package/lib/Utils/generics.js +514 -354
  79. package/lib/Utils/group-history.js +60 -0
  80. package/lib/Utils/history.js +244 -134
  81. package/lib/Utils/identity-change-handler.js +51 -49
  82. package/lib/Utils/index.js +57 -23
  83. package/lib/Utils/jid-display-normalization.js +218 -0
  84. package/lib/Utils/link-preview.js +135 -77
  85. package/lib/Utils/logger.js +9 -3
  86. package/lib/Utils/lt-hash.js +37 -6
  87. package/lib/Utils/make-mutex.js +36 -33
  88. package/lib/Utils/message-composer.js +439 -233
  89. package/lib/Utils/message-retry-manager.js +265 -260
  90. package/lib/Utils/messages-media.js +855 -747
  91. package/lib/Utils/messages.js +2528 -884
  92. package/lib/Utils/meta-ai-msmsg.js +262 -0
  93. package/lib/Utils/native-bridge.js +82 -0
  94. package/lib/Utils/noise-handler.js +195 -200
  95. package/lib/Utils/offline-node-processor.js +35 -33
  96. package/lib/Utils/pre-key-manager.js +103 -102
  97. package/lib/Utils/process-message.js +978 -560
  98. package/lib/Utils/reporting-utils.js +257 -253
  99. package/lib/Utils/session-pool.d.ts +16 -0
  100. package/lib/Utils/session-pool.js +94 -0
  101. package/lib/Utils/signal.js +218 -195
  102. package/lib/Utils/stanza-ack.js +31 -29
  103. package/lib/Utils/sticker.d.ts +17 -0
  104. package/lib/Utils/sticker.js +145 -0
  105. package/lib/Utils/sync-action-utils.js +50 -45
  106. package/lib/Utils/tc-token-utils.js +137 -139
  107. package/lib/Utils/use-multi-file-auth-state.js +109 -109
  108. package/lib/Utils/validate-connection.js +218 -202
  109. package/lib/Utils/view-once-cache.d.ts +9 -0
  110. package/lib/Utils/view-once-cache.js +79 -0
  111. package/lib/Utils/voip-rekey.js +22 -0
  112. package/lib/WABinary/constants.js +1302 -1299
  113. package/lib/WABinary/decode.js +343 -262
  114. package/lib/WABinary/encode.js +12 -4
  115. package/lib/WABinary/generic-utils.js +223 -187
  116. package/lib/WABinary/index.js +33 -6
  117. package/lib/WABinary/jid-utils.js +351 -88
  118. package/lib/WABinary/types.js +2 -2
  119. package/lib/WAM/BinaryInfo.js +12 -9
  120. package/lib/WAM/constants.js +39486 -22853
  121. package/lib/WAM/encode.js +132 -140
  122. package/lib/WAM/index.js +31 -4
  123. package/lib/WAUSync/Protocols/USyncBotProfileProtocol.js +55 -0
  124. package/lib/WAUSync/Protocols/USyncBusinessProtocol.js +43 -0
  125. package/lib/WAUSync/Protocols/USyncContactProtocol.js +53 -51
  126. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +56 -53
  127. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +29 -26
  128. package/lib/WAUSync/Protocols/USyncFeatureProtocol.js +59 -0
  129. package/lib/WAUSync/Protocols/USyncLIDProtocol.js +31 -0
  130. package/lib/WAUSync/Protocols/USyncPictureProtocol.js +32 -0
  131. package/lib/WAUSync/Protocols/USyncSidelistProtocol.js +29 -0
  132. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +38 -37
  133. package/lib/WAUSync/Protocols/USyncTextStatusProtocol.js +38 -0
  134. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +26 -24
  135. package/lib/WAUSync/Protocols/index.js +39 -6
  136. package/lib/WAUSync/USyncQuery.js +132 -97
  137. package/lib/WAUSync/USyncUser.js +49 -30
  138. package/lib/WAUSync/index.js +31 -4
  139. package/lib/antiban.js +4637 -0
  140. package/lib/index.js +48 -15
  141. package/package.json +55 -92
  142. package/lib/WAUSync/Protocols/USyncNewsletterProtocol.js +0 -263
  143. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +0 -51
  144. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +0 -29
@@ -1,54 +1,62 @@
1
- import WebSocket from 'ws';
2
- import { DEFAULT_ORIGIN } from '../../Defaults/index.js';
3
- import { AbstractSocketClient } from './types.js';
4
- export class WebSocketClient extends AbstractSocketClient {
5
- constructor() {
6
- super(...arguments);
7
- this.socket = null;
8
- }
9
- get isOpen() {
10
- return this.socket?.readyState === WebSocket.OPEN;
11
- }
12
- get isClosed() {
13
- return this.socket === null || this.socket?.readyState === WebSocket.CLOSED;
14
- }
15
- get isClosing() {
16
- return this.socket === null || this.socket?.readyState === WebSocket.CLOSING;
17
- }
18
- get isConnecting() {
19
- return this.socket?.readyState === WebSocket.CONNECTING;
20
- }
21
- connect() {
22
- if (this.socket) {
23
- return;
24
- }
25
- this.socket = new WebSocket(this.url, {
26
- origin: DEFAULT_ORIGIN,
27
- headers: this.config.options?.headers,
28
- handshakeTimeout: this.config.connectTimeoutMs,
29
- timeout: this.config.connectTimeoutMs,
30
- agent: this.config.agent
31
- });
32
- this.socket.setMaxListeners(0);
33
- const events = ['close', 'error', 'upgrade', 'message', 'open', 'ping', 'pong', 'unexpected-response'];
34
- for (const event of events) {
35
- this.socket?.on(event, (...args) => this.emit(event, ...args));
36
- }
37
- }
38
- async close() {
39
- if (!this.socket) {
40
- return;
41
- }
42
- const closePromise = new Promise(resolve => {
43
- this.socket?.once('close', resolve);
44
- });
45
- this.socket.close();
46
- await closePromise;
47
- this.socket = null;
48
- }
49
- send(str, cb) {
50
- this.socket?.send(str, cb);
51
- return Boolean(this.socket);
52
- }
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.WebSocketClient = void 0
9
+ const ws_1 = __importDefault(require('ws'))
10
+ const Defaults_1 = require('../../Defaults')
11
+ const types_1 = require('./types')
12
+ class WebSocketClient extends types_1.AbstractSocketClient {
13
+ constructor() {
14
+ super(...arguments)
15
+ this.socket = null
16
+ }
17
+ get isOpen() {
18
+ return this.socket?.readyState === ws_1.default.OPEN
19
+ }
20
+ get isClosed() {
21
+ return this.socket === null || this.socket?.readyState === ws_1.default.CLOSED
22
+ }
23
+ get isClosing() {
24
+ return this.socket === null || this.socket?.readyState === ws_1.default.CLOSING
25
+ }
26
+ get isConnecting() {
27
+ return this.socket?.readyState === ws_1.default.CONNECTING
28
+ }
29
+ connect() {
30
+ if (this.socket) {
31
+ return
32
+ }
33
+ this.socket = new ws_1.default(this.url, {
34
+ origin: Defaults_1.DEFAULT_ORIGIN,
35
+ headers: this.config.options?.headers,
36
+ handshakeTimeout: this.config.connectTimeoutMs,
37
+ timeout: this.config.connectTimeoutMs,
38
+ agent: this.config.agent
39
+ })
40
+ this.socket.setMaxListeners(0)
41
+ const events = ['close', 'error', 'upgrade', 'message', 'open', 'ping', 'pong', 'unexpected-response']
42
+ for (const event of events) {
43
+ this.socket?.on(event, (...args) => this.emit(event, ...args))
44
+ }
45
+ }
46
+ async close() {
47
+ if (!this.socket) {
48
+ return
49
+ }
50
+ const closePromise = new Promise(resolve => {
51
+ this.socket?.once('close', resolve)
52
+ })
53
+ this.socket.close()
54
+ await closePromise
55
+ this.socket = null
56
+ }
57
+ send(str, cb) {
58
+ this.socket?.send(str, cb)
59
+ return Boolean(this.socket)
60
+ }
53
61
  }
54
- //# sourceMappingURL=websocket.js.map
62
+ exports.WebSocketClient = WebSocketClient
@@ -0,0 +1,240 @@
1
+ 'use strict'
2
+ Object.defineProperty(exports, '__esModule', { value: true })
3
+ exports.extractAIGroupMetadata = exports.makeAIGroupsSocket = void 0
4
+ const Types_1 = require('../Types')
5
+ const Utils_1 = require('../Utils')
6
+ const WABinary_1 = require('../WABinary')
7
+ const groups_1 = require('./groups')
8
+
9
+ const makeAIGroupsSocket = config => {
10
+ const sock = (0, groups_1.makeGroupsSocket)(config)
11
+ const { ev, query } = sock
12
+
13
+ /** Query helper for AI groups (w:gp2 namespace) */
14
+ const aiGroupQuery = async (jid, type, content) =>
15
+ query({
16
+ tag: 'iq',
17
+ attrs: {
18
+ type,
19
+ xmlns: 'w:g2',
20
+ to: jid
21
+ },
22
+ content
23
+ })
24
+
25
+ const aiGroupMetadata = async jid => {
26
+ const result = await aiGroupQuery(jid, 'get', [{ tag: 'query', attrs: { request: 'interactive' } }])
27
+ return (0, exports.extractAIGroupMetadata)(result)
28
+ }
29
+
30
+ // Handle incoming w:gp2 notifications (create, promote, remove, add)
31
+ sock.ws.on('CB:notification,w:gp2', async node => {
32
+ const { attrs, content } = node
33
+ if (!Array.isArray(content) || content.length === 0) return
34
+
35
+ const inner = content[0]
36
+ const tag = inner.tag
37
+ const groupId =
38
+ typeof attrs.from === 'string'
39
+ ? attrs.from
40
+ : attrs.from?.$1?.user
41
+ ? (0, WABinary_1.jidEncode)(attrs.from.$1.user, 'g.us')
42
+ : undefined
43
+
44
+ if (!groupId) return
45
+
46
+ if (tag === 'create') {
47
+ // New AI group created — emit groups.upsert
48
+ try {
49
+ const meta = await aiGroupMetadata(groupId)
50
+ ev.emit('groups.upsert', [meta])
51
+ } catch {
52
+ // metadata fetch may fail; emit minimal info
53
+ ev.emit('groups.upsert', [{ id: groupId }])
54
+ }
55
+ } else if (tag === 'promote' || tag === 'demote' || tag === 'remove' || tag === 'add') {
56
+ const participants = (0, WABinary_1.getBinaryNodeChildren)(inner, 'participant')
57
+ .map(p => {
58
+ const jid = p.attrs.jid
59
+ if (typeof jid === 'string') return jid
60
+ if (jid?.$1) {
61
+ return (0, WABinary_1.jidEncode)(jid.$1.user, jid.$1.server || 's.whatsapp.net')
62
+ }
63
+ return undefined
64
+ })
65
+ .filter(Boolean)
66
+
67
+ ev.emit('group-participants.update', {
68
+ id: groupId,
69
+ participants,
70
+ action: tag
71
+ })
72
+ } else if (tag === 'subject') {
73
+ ev.emit('groups.update', [{ id: groupId, subject: inner.attrs?.subject }])
74
+ }
75
+
76
+ await sock.sendMessageAck(node)
77
+ })
78
+
79
+ return {
80
+ ...sock,
81
+ aiGroupMetadata,
82
+ aiGroupCreate: async (subject, participants = [], options = {}) => {
83
+ if (!Array.isArray(participants)) participants = []
84
+ const key = (0, Utils_1.generateMessageIDV2)()
85
+ const {
86
+ ephemeralExpiration = 86400,
87
+ memberAddMode = 'all_member_add',
88
+ memberShareGroupHistoryMode = 'all_member_share',
89
+ memberLinkMode = 'all_member_link'
90
+ } = options
91
+ const result = await aiGroupQuery('@g.us', 'set', [
92
+ {
93
+ tag: 'create',
94
+ attrs: {
95
+ subject,
96
+ key
97
+ },
98
+ content: participants.map(jid => ({
99
+ tag: 'participant',
100
+ attrs: { jid }
101
+ }))
102
+ }
103
+ ])
104
+ return (0, exports.extractAIGroupMetadata)(result)
105
+ },
106
+ aiGroupAddBot: async (jid, botUser = '867051314767696') => {
107
+ const result = await aiGroupQuery(jid, 'set', [
108
+ {
109
+ tag: 'add',
110
+ attrs: {},
111
+ content: [
112
+ {
113
+ tag: 'participant',
114
+ attrs: { jid: `${botUser}@bot` }
115
+ }
116
+ ]
117
+ }
118
+ ])
119
+ const node = (0, WABinary_1.getBinaryNodeChild)(result, 'add')
120
+ const participantsAffected = (0, WABinary_1.getBinaryNodeChildren)(node, 'participant')
121
+ return participantsAffected.map(p => ({
122
+ status: p.attrs.error || '200',
123
+ jid: p.attrs.jid
124
+ }))
125
+ },
126
+ aiGroupLeave: async id => {
127
+ await aiGroupQuery('@g.us', 'set', [
128
+ {
129
+ tag: 'leave',
130
+ attrs: {},
131
+ content: [{ tag: 'group', attrs: { id } }]
132
+ }
133
+ ])
134
+ },
135
+ aiGroupParticipantsUpdate: async (jid, participants, action) => {
136
+ const result = await aiGroupQuery(jid, 'set', [
137
+ {
138
+ tag: action,
139
+ attrs: {},
140
+ content: participants.map(jid => ({
141
+ tag: 'participant',
142
+ attrs: { jid }
143
+ }))
144
+ }
145
+ ])
146
+ const node = (0, WABinary_1.getBinaryNodeChild)(result, action)
147
+ const participantsAffected = (0, WABinary_1.getBinaryNodeChildren)(node, 'participant')
148
+ return participantsAffected.map(p => ({
149
+ status: p.attrs.error || '200',
150
+ jid: p.attrs.jid,
151
+ content: p
152
+ }))
153
+ },
154
+ aiGroupUpdateSubject: async (jid, subject) => {
155
+ await aiGroupQuery(jid, 'set', [
156
+ {
157
+ tag: 'subject',
158
+ attrs: {},
159
+ content: Buffer.from(subject, 'utf-8')
160
+ }
161
+ ])
162
+ },
163
+ aiGroupInviteCode: async jid => {
164
+ const result = await aiGroupQuery(jid, 'get', [{ tag: 'invite', attrs: {} }])
165
+ const inviteNode = (0, WABinary_1.getBinaryNodeChild)(result, 'invite')
166
+ return inviteNode?.attrs.code
167
+ },
168
+ aiGroupRevokeInvite: async jid => {
169
+ const result = await aiGroupQuery(jid, 'set', [{ tag: 'invite', attrs: {} }])
170
+ const inviteNode = (0, WABinary_1.getBinaryNodeChild)(result, 'invite')
171
+ return inviteNode?.attrs.code
172
+ },
173
+ aiGroupAcceptInvite: async code => {
174
+ const results = await aiGroupQuery('@g.us', 'set', [{ tag: 'invite', attrs: { code } }])
175
+ const result = (0, WABinary_1.getBinaryNodeChild)(results, 'group')
176
+ return result?.attrs.jid
177
+ },
178
+ aiGroupSettingUpdate: async (jid, setting) => {
179
+ await aiGroupQuery(jid, 'set', [{ tag: setting, attrs: {} }])
180
+ },
181
+ aiGroupToggleEphemeral: async (jid, ephemeralExpiration) => {
182
+ const content = ephemeralExpiration
183
+ ? { tag: 'ephemeral', attrs: { expiration: ephemeralExpiration.toString() } }
184
+ : { tag: 'not_ephemeral', attrs: {} }
185
+ await aiGroupQuery(jid, 'set', [content])
186
+ }
187
+ }
188
+ }
189
+ exports.makeAIGroupsSocket = makeAIGroupsSocket
190
+
191
+ const extractAIGroupMetadata = result => {
192
+ // IQ response nests group inside create node: result → create → group
193
+ const createNode = (0, WABinary_1.getBinaryNodeChild)(result, 'create')
194
+ const group =
195
+ (0, WABinary_1.getBinaryNodeChild)(createNode || result, 'group') ||
196
+ (0, WABinary_1.getBinaryNodeChild)(result, 'group')
197
+ const descChild = (0, WABinary_1.getBinaryNodeChild)(group, 'description')
198
+ let desc, descId, descOwner, descOwnerPn, descTime
199
+ if (descChild) {
200
+ desc = (0, WABinary_1.getBinaryNodeChildString)(descChild, 'body')
201
+ descOwner = descChild.attrs.participant ? (0, WABinary_1.jidNormalizedUser)(descChild.attrs.participant) : undefined
202
+ descOwnerPn = descChild.attrs.participant_pn
203
+ ? (0, WABinary_1.jidNormalizedUser)(descChild.attrs.participant_pn)
204
+ : undefined
205
+ descTime = +descChild.attrs.t
206
+ descId = descChild.attrs.id
207
+ }
208
+ const groupId = group.attrs.id.includes('@') ? group.attrs.id : (0, WABinary_1.jidEncode)(group.attrs.id, 'g.us')
209
+ const eph = (0, WABinary_1.getBinaryNodeChild)(group, 'ephemeral')?.attrs.expiration
210
+ const metadata = {
211
+ id: groupId,
212
+ subject: group.attrs.subject,
213
+ subjectTime: +group.attrs.s_t,
214
+ creation: +group.attrs.creation,
215
+ owner: group.attrs.creator ? (0, WABinary_1.jidNormalizedUser)(group.attrs.creator) : undefined,
216
+ ownerPn: group.attrs.creator_pn ? (0, WABinary_1.jidNormalizedUser)(group.attrs.creator_pn) : undefined,
217
+ owner_country_code: group.attrs.creator_country_code,
218
+ size: group.attrs.size ? +group.attrs.size : (0, WABinary_1.getBinaryNodeChildren)(group, 'participant').length,
219
+ desc,
220
+ descId,
221
+ descOwner,
222
+ descOwnerPn,
223
+ descTime,
224
+ isAIGroup: true,
225
+ addressingMode:
226
+ group.attrs.addressing_mode === 'lid' ? Types_1.WAMessageAddressingMode.LID : Types_1.WAMessageAddressingMode.PN,
227
+ participants: (0, WABinary_1.getBinaryNodeChildren)(group, 'participant').map(({ attrs }) => ({
228
+ id: attrs.jid,
229
+ phoneNumber:
230
+ (0, WABinary_1.isLidUser)(attrs.jid) && (0, WABinary_1.isPnUser)(attrs.phone_number)
231
+ ? attrs.phone_number
232
+ : undefined,
233
+ lid: (0, WABinary_1.isPnUser)(attrs.jid) && (0, WABinary_1.isLidUser)(attrs.lid) ? attrs.lid : undefined,
234
+ admin: attrs.type || null
235
+ })),
236
+ ephemeralDuration: eph ? +eph : undefined
237
+ }
238
+ return metadata
239
+ }
240
+ exports.extractAIGroupMetadata = extractAIGroupMetadata