kage-baileys 3.0.6 → 3.2.4

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 (217) hide show
  1. package/Example/connection.cjs +4 -0
  2. package/README.MD +4726 -48
  3. package/README.md +5941 -0
  4. package/WAProto/WAProto.proto +3395 -415
  5. package/WAProto/compat.cjs +12 -0
  6. package/WAProto/index.d.ts +47104 -19888
  7. package/WAProto/index.js +131979 -57361
  8. package/lib/Addon/http-error.js +43 -0
  9. package/lib/Addon/index.js +32 -0
  10. package/lib/Addon/keyed-db.js +250 -0
  11. package/lib/Addon/link-preview.js +82 -0
  12. package/lib/Defaults/baileys-version.json +3 -0
  13. package/lib/Defaults/connection.js +110 -0
  14. package/lib/Defaults/constants.js +156 -0
  15. package/lib/Defaults/history.js +46 -0
  16. package/lib/Defaults/index.js +230 -0
  17. package/lib/Defaults/media.js +104 -0
  18. package/lib/Defaults/phonenumber-mcc.json +223 -0
  19. package/lib/Defaults/prefix.js +44 -0
  20. package/lib/Extensions/business-advanced.js +382 -0
  21. package/lib/Extensions/business.js +159 -0
  22. package/lib/Extensions/chats-advanced.js +1106 -0
  23. package/lib/Extensions/chats.js +349 -0
  24. package/lib/Extensions/communities-advanced.js +430 -0
  25. package/lib/Extensions/community.js +94 -0
  26. package/lib/Extensions/groups-advanced.js +343 -0
  27. package/lib/Extensions/index.js +30 -0
  28. package/lib/Extensions/messages-recv-advanced.js +1690 -0
  29. package/lib/Extensions/messages-send-advanced.js +622 -0
  30. package/lib/Extensions/messages-send.js +1380 -0
  31. package/lib/Extensions/newsletter-advanced.js +228 -0
  32. package/lib/Extensions/newsletter.js +72 -0
  33. package/lib/Extensions/socket.js +389 -0
  34. package/lib/Modded/message_builder.js +2084 -4
  35. package/lib/Signal/Group/ciphertext-message.js +54 -0
  36. package/lib/Signal/Group/group-session-builder.js +124 -0
  37. package/lib/Signal/Group/group_cipher.js +216 -0
  38. package/lib/Signal/Group/index.js +124 -0
  39. package/lib/Signal/Group/keyhelper.js +108 -0
  40. package/lib/Signal/Group/sender-chain-key.js +83 -0
  41. package/lib/Signal/Group/sender-key-distribution-message.js +157 -0
  42. package/lib/Signal/Group/sender-key-message.js +166 -0
  43. package/lib/Signal/Group/sender-key-name.js +130 -0
  44. package/lib/Signal/Group/sender-key-record.js +113 -0
  45. package/lib/Signal/Group/sender-key-state.js +208 -0
  46. package/lib/Signal/Group/sender-message-key.js +82 -0
  47. package/lib/Signal/libsignal.js +935 -0
  48. package/lib/Signal/lid-mapping.js +545 -1
  49. package/lib/Socket/Client/index.js +60 -0
  50. package/lib/Socket/Client/types.js +51 -0
  51. package/lib/Socket/Client/websocket.js +152 -0
  52. package/lib/Socket/business.js +831 -0
  53. package/lib/Socket/chats.js +2535 -49
  54. package/lib/Socket/communities.js +450 -1
  55. package/lib/Socket/community.js +1022 -0
  56. package/lib/Socket/dugong.js +1 -1
  57. package/lib/Socket/groups.js +747 -0
  58. package/lib/Socket/index.js +60 -2
  59. package/lib/Socket/messages-recv.js +3450 -5
  60. package/lib/Socket/messages-send.js +3123 -0
  61. package/lib/Socket/mex.js +126 -1
  62. package/lib/Socket/newsletter.js +465 -0
  63. package/lib/Socket/socket.js +2217 -1
  64. package/lib/Store/index.js +79 -0
  65. package/lib/Store/make-cache-manager-store.js +186 -0
  66. package/lib/Store/make-in-memory-store.js +878 -0
  67. package/lib/Store/make-ordered-dictionary.js +187 -0
  68. package/lib/Store/object-repository.js +78 -0
  69. package/lib/Types/Auth.js +25 -0
  70. package/lib/Types/Bussines.js +25 -1
  71. package/lib/Types/Call.js +25 -0
  72. package/lib/Types/Chat.js +39 -0
  73. package/lib/Types/Contact.js +25 -0
  74. package/lib/Types/Events.js +25 -0
  75. package/lib/Types/GroupMetadata.js +25 -0
  76. package/lib/Types/Label.js +76 -0
  77. package/lib/Types/LabelAssociation.js +40 -0
  78. package/lib/Types/Message.js +57 -0
  79. package/lib/Types/Mex.js +56 -1
  80. package/lib/Types/MexUpdates.js +46 -0
  81. package/lib/Types/Newsletter.js +56 -0
  82. package/lib/Types/Product.js +25 -0
  83. package/lib/Types/RichType.js +23 -0
  84. package/lib/Types/Signal.js +25 -0
  85. package/lib/Types/Socket.js +25 -0
  86. package/lib/Types/State.js +92 -0
  87. package/lib/Types/USync.js +25 -0
  88. package/lib/Types/index.js +133 -0
  89. package/lib/Utils/auth-utils.js +703 -0
  90. package/lib/Utils/automation-tools.js +51 -16
  91. package/lib/Utils/baileys-event-stream.js +146 -0
  92. package/lib/Utils/browser-utils.js +95 -0
  93. package/lib/Utils/business.js +525 -0
  94. package/lib/Utils/chat-utils.js +1861 -0
  95. package/lib/Utils/companion-reg-client-utils.js +55 -1
  96. package/lib/Utils/crypto.js +355 -0
  97. package/lib/Utils/decode-wa-message.js +709 -0
  98. package/lib/Utils/event-buffer.js +1323 -8
  99. package/lib/Utils/generics.js +945 -1
  100. package/lib/Utils/history.js +266 -0
  101. package/lib/Utils/identity-change-handler.js +62 -1
  102. package/lib/Utils/index.js +114 -0
  103. package/lib/Utils/link-preview.js +179 -0
  104. package/lib/Utils/logger.js +42 -0
  105. package/lib/Utils/lt-hash.js +73 -0
  106. package/lib/Utils/make-mutex.js +104 -0
  107. package/lib/Utils/message-inspector.js +110 -0
  108. package/lib/Utils/message-retry-manager.js +507 -2
  109. package/lib/Utils/messages-media.js +1931 -1
  110. package/lib/Utils/messages.js +3748 -0
  111. package/lib/Utils/noise-handler.js +423 -0
  112. package/lib/Utils/offline-node-processor.js +53 -1
  113. package/lib/Utils/pre-key-manager.js +255 -1
  114. package/lib/Utils/process-message.js +1592 -0
  115. package/lib/Utils/reporting-utils.js +272 -1
  116. package/lib/Utils/rich-message-utils.js +377 -0
  117. package/lib/Utils/rich-messages.js +1 -1
  118. package/lib/Utils/signal.js +437 -0
  119. package/lib/Utils/stanza-ack.js +51 -1
  120. package/lib/Utils/status-refresh.js +37 -0
  121. package/lib/Utils/status-tools.js +4 -2
  122. package/lib/Utils/sync-action-utils.js +63 -1
  123. package/lib/Utils/tc-token-utils.js +185 -1
  124. package/lib/Utils/terminal-banner.js +31 -0
  125. package/lib/Utils/use-multi-file-auth-state.js +271 -0
  126. package/lib/Utils/use-single-file-auth-state.js +108 -0
  127. package/lib/Utils/use-sqlite-auth-state.js +142 -0
  128. package/lib/Utils/validate-connection.js +497 -1
  129. package/lib/Utils/view-once-compat.js +13 -5
  130. package/lib/VoIP/audio-feeder.js +150 -0
  131. package/lib/VoIP/index.js +289 -0
  132. package/lib/VoIP/relay-transport.js +608 -0
  133. package/lib/VoIP/signaling.js +583 -0
  134. package/lib/VoIP/types.js +30 -0
  135. package/lib/VoIP/wasm-engine.js +1261 -2
  136. package/lib/VoIP/worker-bootstrap.js +1090 -2
  137. package/lib/WABinary/constants.js +2805 -0
  138. package/lib/WABinary/decode.js +649 -2
  139. package/lib/WABinary/encode.js +564 -2
  140. package/lib/WABinary/generic-utils.js +401 -0
  141. package/lib/WABinary/index.js +82 -0
  142. package/lib/WABinary/jid-utils.js +290 -0
  143. package/lib/WABinary/types.js +25 -0
  144. package/lib/WAM/BinaryInfo.js +50 -0
  145. package/lib/WAM/constants.js +45747 -0
  146. package/lib/WAM/encode.js +393 -0
  147. package/lib/WAM/index.js +78 -0
  148. package/lib/WAUSync/Protocols/USyncBotProfileProtocol.js +135 -0
  149. package/lib/WAUSync/Protocols/USyncContactProtocol.js +110 -0
  150. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +142 -0
  151. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +85 -0
  152. package/lib/WAUSync/Protocols/USyncLIDProtocol.js +69 -0
  153. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +107 -0
  154. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +38 -1
  155. package/lib/WAUSync/Protocols/index.js +83 -0
  156. package/lib/WAUSync/USyncQuery.js +241 -2
  157. package/lib/WAUSync/USyncUser.js +86 -0
  158. package/lib/WAUSync/index.js +78 -0
  159. package/lib/assets/wasm/loader.js +1875 -1
  160. package/lib/assets/wasm/worker-modules.js +11047 -1
  161. package/lib/index.d.ts +126 -0
  162. package/lib/index.js +53 -21
  163. package/lib/index.mjs +437 -0
  164. package/licenses/upstream-MIT.txt +22 -0
  165. package/maintenance/api-coverage.json +1642 -0
  166. package/maintenance/archivos-sha256.json +207 -0
  167. package/maintenance/consumer-validation.log +3 -0
  168. package/maintenance/dependency-audit.json +4 -4
  169. package/maintenance/extension-inventory.json +57 -0
  170. package/maintenance/protocol-update.json +1101 -0
  171. package/maintenance/protocol-wire-audit.json +4 -0
  172. package/maintenance/reference-socket-surface.json +209 -0
  173. package/maintenance/resumen-validacion.json +50 -0
  174. package/maintenance/validation.log +2725 -0
  175. package/maintenance/verification.json +566 -0
  176. package/package.json +107 -9
  177. package/scripts/check-imports.cjs +10 -0
  178. package/scripts/check-package.cjs +40 -0
  179. package/scripts/check-syntax.cjs +1 -1
  180. package/scripts/generate-protobuf.cjs +6 -1
  181. package/scripts/generate-public-types.cjs +9 -0
  182. package/scripts/kage-base64-fix.cjs +45 -0
  183. package/scripts/maintenance.cjs +10 -0
  184. package/test/advanced.test.cjs +24 -0
  185. package/test/base64-fix.test.cjs +49 -0
  186. package/test/maintenance.test.cjs +1 -1
  187. package/test/npm-publication.test.cjs +141 -0
  188. package/test/recepcion-reparada.test.cjs +98 -0
  189. package/test/resilience-binary.test.cjs +69 -0
  190. package/test/resilience-transport.test.cjs +34 -0
  191. package/test/types.test.ts +5 -0
  192. package/test/upgrade.test.cjs +104 -0
  193. package/tsconfig.json +20 -0
  194. package/WAProto/p.html +0 -1
  195. package/lib/KageExtra/Modded/message_builder.js +0 -2330
  196. package/lib/KageExtra/VoIP/audio-feeder.js +0 -136
  197. package/lib/KageExtra/VoIP/index.js +0 -282
  198. package/lib/KageExtra/VoIP/relay-transport.js +0 -559
  199. package/lib/KageExtra/VoIP/signaling.js +0 -603
  200. package/lib/KageExtra/VoIP/types.js +0 -17
  201. package/lib/KageExtra/VoIP/wasm-engine.js +0 -1214
  202. package/lib/KageExtra/VoIP/worker-bootstrap.js +0 -1042
  203. package/lib/KageExtra/assets/wasm/loader.js +0 -5
  204. package/lib/KageExtra/assets/wasm/whatsapp.wasm +0 -0
  205. package/lib/KageExtra/assets/wasm/worker-modules.js +0 -273
  206. package/lib/KageExtra/index.js +0 -3
  207. package/lib/KageExtra/package.json +0 -1
  208. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +0 -53
  209. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +0 -24
  210. package/maintenance/revision-full-check.txt +0 -1097
  211. package/maintenance/revision-library-tests.tap +0 -1088
  212. package/maintenance/revision-protobuf.txt +0 -5
  213. package/maintenance/revision-syntax.txt +0 -5
  214. package/maintenance/schema-coverage.json +0 -23
  215. package/maintenance/schema-merge.json +0 -30
  216. package/maintenance/validation-node20.txt +0 -191
  217. package/maintenance/validation-node22.txt +0 -237
package/lib/Socket/mex.js CHANGED
@@ -45,4 +45,129 @@ const wMexQuery = (variables, queryId, query, generateMessageTag) => {
45
45
  : _optionalChain([dataPath, 'optionalAccess', _8 => _8.replace, 'call', _9 => _9(/_/g, ' ')]);
46
46
  throw new (0, _boom.Boom)(`Failed to ${action}, unexpected response structure: ${JSON.stringify(result, null, 2)}`, { statusCode: 400, data: result });
47
47
  }; exports.executeWMexQuery = executeWMexQuery;
48
- //# sourceMappingURL=mex.js.map
48
+ //#
49
+ // Kage: compatibilidad de API.
50
+ const __kageModule31 = (() => {
51
+ const module = { exports: {} }; const exports = module.exports;
52
+ "use strict"
53
+
54
+ Object.defineProperty(exports, "__esModule", { value: true })
55
+
56
+ const { Boom } = require("@hapi/boom")
57
+ const {
58
+ getBinaryNodeChild,
59
+ S_WHATSAPP_NET
60
+ } = require("../WABinary")
61
+
62
+ const wMexQuery = (variables, queryId, query, generateMessageTag) => {
63
+ return query({
64
+ tag: 'iq',
65
+ attrs: {
66
+ id: generateMessageTag(),
67
+ type: 'get',
68
+ to: S_WHATSAPP_NET,
69
+ xmlns: 'w:mex'
70
+ },
71
+ content: [
72
+ {
73
+ tag: 'query',
74
+ attrs: { query_id: queryId },
75
+ content: Buffer.from(JSON.stringify({ variables }), 'utf-8')
76
+ }
77
+ ]
78
+ })
79
+ }
80
+
81
+ const executeWMexQuery = async (variables, queryId, dataPath, query, generateMessageTag) => {
82
+ const result = await wMexQuery(variables, queryId, query, generateMessageTag)
83
+ const child = getBinaryNodeChild(result, 'result')
84
+
85
+ if (child?.content) {
86
+ const data = JSON.parse(child.content.toString())
87
+
88
+ if (data.errors && data.errors.length > 0) {
89
+ const errorMessages = data.errors.map((err) => err.message || 'Unknown error').join(', ')
90
+ const firstError = data.errors[0]
91
+ const errorCode = firstError.extensions?.error_code || 400
92
+
93
+ throw new Boom(`GraphQL server error: ${errorMessages}`, { statusCode: errorCode, data: firstError })
94
+ }
95
+
96
+ const response = dataPath ? data?.data?.[dataPath] : data?.data
97
+
98
+ if (typeof response !== 'undefined') {
99
+ return response
100
+ }
101
+ }
102
+
103
+ const action = (dataPath || '').startsWith('xwa2_')
104
+ ? dataPath.substring(5).replace(/_/g, ' ')
105
+ : dataPath?.replace(/_/g, ' ')
106
+
107
+ throw new Boom(`Failed to ${action}, unexpected response structure.`, { statusCode: 400, data: result })
108
+ }
109
+
110
+ module.exports = {
111
+ executeWMexQuery
112
+ }
113
+ return module.exports;
114
+ })();
115
+ for (const key of Object.keys(__kageModule31)) {
116
+ if (key !== '__esModule' && !Object.prototype.hasOwnProperty.call(exports,key)) Object.defineProperty(exports,key,{enumerable:true,configurable:true,get:()=>__kageModule31[key]});
117
+ }
118
+
119
+ // Kage: funciones avanzadas.
120
+ const __kageModule137 = (() => {
121
+ const module = { exports: {} }; const exports = module.exports;
122
+ "use strict";
123
+ Object.defineProperty(exports, "__esModule", { value: true });
124
+ exports.executeWMexQuery = void 0;
125
+ const index_js_1 = require("../Addon/index.js");
126
+ const index_js_2 = require("../WABinary/index.js");
127
+ const wMexQuery = (variables, queryId, query, generateMessageTag) => {
128
+ return query({
129
+ tag: 'iq',
130
+ attrs: {
131
+ id: generateMessageTag(),
132
+ type: 'get',
133
+ to: index_js_2.S_WHATSAPP_NET,
134
+ xmlns: 'w:mex'
135
+ },
136
+ content: [
137
+ {
138
+ tag: 'query',
139
+ attrs: { query_id: queryId },
140
+ content: Buffer.from(JSON.stringify({ variables }), 'utf-8')
141
+ }
142
+ ]
143
+ });
144
+ };
145
+ const executeWMexQuery = async (variables, queryId, dataPath, query, generateMessageTag) => {
146
+ const result = await wMexQuery(variables, queryId, query, generateMessageTag);
147
+ const child = (0, index_js_2.getBinaryNodeChild)(result, 'result');
148
+ if (child?.content) {
149
+ const data = JSON.parse(child.content.toString());
150
+ if (data.errors && data.errors.length > 0) {
151
+ const errorMessages = data.errors.map((err) => err.message || 'Unknown error').join(', ');
152
+ const firstError = data.errors[0];
153
+ const errorCode = firstError.extensions?.error_code || 400;
154
+ throw new index_js_1.HttpError(`GraphQL server error: ${errorMessages}`, { statusCode: errorCode, data: firstError });
155
+ }
156
+ const response = dataPath ? data?.data?.[dataPath] : data?.data;
157
+ if (typeof response !== 'undefined') {
158
+ return response;
159
+ }
160
+ }
161
+ const action = (dataPath || '').startsWith('xwa2_')
162
+ ? dataPath.substring(5).replace(/_/g, ' ')
163
+ : dataPath?.replace(/_/g, ' ');
164
+ throw new index_js_1.HttpError(`Failed to ${action}, unexpected response structure.`, { statusCode: 400, data: result });
165
+ };
166
+ exports.executeWMexQuery = executeWMexQuery;
167
+
168
+ return module.exports;
169
+ })();
170
+ for (const key of Object.keys(__kageModule137)) {
171
+ if (key !== '__esModule' && !Object.prototype.hasOwnProperty.call(exports,key)) Object.defineProperty(exports,key,{enumerable:true,configurable:true,get:()=>__kageModule137[key]});
172
+ }
173
+ Object.defineProperty(exports, Symbol.for('kage.advanced'), {value:__kageModule137, configurable:true});
@@ -248,3 +248,468 @@ const extractNewsletterMetadata = (node, isCreate) => {
248
248
  return metadata;
249
249
  };
250
250
  exports.extractNewsletterMetadata = extractNewsletterMetadata;
251
+
252
+ // Kage: compatibilidad de API.
253
+ const __kageModule32 = (() => {
254
+ const module = { exports: {} }; const exports = module.exports;
255
+ "use strict"
256
+
257
+ Object.defineProperty(exports, "__esModule", { value: true })
258
+
259
+ const {
260
+ QueryIds,
261
+ XWAPaths
262
+ } = require("../Types")
263
+ const { generateProfilePicture } = require("../Utils")
264
+ const { getBinaryNodeChild } = require("../WABinary")
265
+ const { makeGroupsSocket } = require("./groups")
266
+ const { executeWMexQuery: genericExecuteWMexQuery } = require("./mex")
267
+
268
+ const parseNewsletterCreateResponse = (response) => {
269
+ const { id, thread_metadata: thread, viewer_metadata: viewer } = response
270
+ return {
271
+ id: id,
272
+ owner: undefined,
273
+ name: thread.name.text,
274
+ creation_time: parseInt(thread.creation_time, 10),
275
+ description: thread.description.text,
276
+ invite: thread.invite,
277
+ subscribers: parseInt(thread.subscribers_count, 10),
278
+ verification: thread.verification,
279
+ picture: {
280
+ id: thread.picture.id,
281
+ directPath: thread.picture.direct_path
282
+ },
283
+ mute_state: viewer.mute
284
+ }
285
+ }
286
+
287
+ const parseNewsletterMetadata = (result) => {
288
+ if (typeof result !== 'object' || result === null) {
289
+ return null
290
+ }
291
+
292
+ if ('id' in result && typeof result.id === 'string') {
293
+ return result
294
+ }
295
+
296
+ if ('result' in result && typeof result.result === 'object' && result.result !== null && 'id' in result.result) {
297
+ return result.result
298
+ }
299
+
300
+ return null
301
+ }
302
+
303
+ const makeNewsletterSocket = (config) => {
304
+ const suki = makeGroupsSocket(config)
305
+ const {
306
+ query,
307
+ generateMessageTag
308
+ } = suki
309
+
310
+ const executeWMexQuery = (variables, queryId, dataPath) => {
311
+ return genericExecuteWMexQuery(variables, queryId, dataPath, query, generateMessageTag)
312
+ }
313
+
314
+ const newsletterUpdate = async (jid, updates) => {
315
+ const variables = {
316
+ newsletter_id: jid,
317
+ updates: {
318
+ ...updates,
319
+ settings: null
320
+ }
321
+ }
322
+
323
+ return executeWMexQuery(variables, QueryIds.UPDATE_METADATA, XWAPaths.UPDATE)
324
+ }
325
+
326
+ return {
327
+ ...suki,
328
+ executeWMexQuery,
329
+ newsletterCreate: async (name, description) => {
330
+ const variables = {
331
+ input: {
332
+ name,
333
+ description: description ?? null
334
+ }
335
+ }
336
+
337
+ const rawResponse = await executeWMexQuery(variables, QueryIds.CREATE, XWAPaths.CREATE)
338
+
339
+ return parseNewsletterCreateResponse(rawResponse)
340
+ },
341
+ newsletterUpdate,
342
+ newsletterSubscribers: async (jid) => {
343
+ return executeWMexQuery({ newsletter_id: jid }, QueryIds.SUBSCRIBERS, XWAPaths.SUBSCRIBERS)
344
+ },
345
+ newsletterMetadata: async (type, key) => {
346
+ const variables = {
347
+ fetch_creation_time: true,
348
+ fetch_full_image: true,
349
+ fetch_viewer_metadata: true,
350
+ input: {
351
+ key,
352
+ type: type.toUpperCase()
353
+ }
354
+ }
355
+
356
+ const result = await executeWMexQuery(variables, QueryIds.METADATA, XWAPaths.METADATA)
357
+
358
+ return parseNewsletterMetadata(result)
359
+ },
360
+ newsletterFollow: (jid) => {
361
+ return executeWMexQuery({ newsletter_id: jid }, QueryIds.FOLLOW, XWAPaths.FOLLOW)
362
+ },
363
+ newsletterUnfollow: (jid) => {
364
+ return executeWMexQuery({ newsletter_id: jid }, QueryIds.UNFOLLOW, XWAPaths.UNFOLLOW)
365
+ },
366
+ newsletterMute: (jid) => {
367
+ return executeWMexQuery({ newsletter_id: jid }, QueryIds.MUTE, XWAPaths.MUTE_V2)
368
+ },
369
+ newsletterUnmute: (jid) => {
370
+ return executeWMexQuery({ newsletter_id: jid }, QueryIds.UNMUTE, XWAPaths.UNMUTE_V2)
371
+ },
372
+ newsletterUpdateName: async (jid, name) => {
373
+ return await newsletterUpdate(jid, { name })
374
+ },
375
+ newsletterUpdateDescription: async (jid, description) => {
376
+ return await newsletterUpdate(jid, { description })
377
+ },
378
+ newsletterUpdatePicture: async (jid, content) => {
379
+ const { img } = await generateProfilePicture(content)
380
+ return await newsletterUpdate(jid, { picture: img.toString('base64') })
381
+ },
382
+ newsletterRemovePicture: async (jid) => {
383
+ return await newsletterUpdate(jid, { picture: '' })
384
+ },
385
+ newsletterReactMessage: async (jid, serverId, reaction) => {
386
+ await query({
387
+ tag: 'message',
388
+ attrs: {
389
+ to: jid,
390
+ ...(reaction ? {} : { edit: '7' }),
391
+ type: 'reaction',
392
+ server_id: serverId,
393
+ id: generateMessageTag()
394
+ },
395
+ content: [
396
+ {
397
+ tag: 'reaction',
398
+ attrs: reaction ? { code: reaction } : {}
399
+ }
400
+ ]
401
+ })
402
+ },
403
+ newsletterFetchMessages: async (jid, count, since, after) => {
404
+ const messageUpdateAttrs = {
405
+ count: count.toString()
406
+ }
407
+
408
+ if (typeof since === 'number') {
409
+ messageUpdateAttrs.since = since.toString()
410
+ }
411
+
412
+ if (after) {
413
+ messageUpdateAttrs.after = after.toString()
414
+ }
415
+
416
+ const result = await query({
417
+ tag: 'iq',
418
+ attrs: {
419
+ id: generateMessageTag(),
420
+ type: 'get',
421
+ xmlns: 'newsletter',
422
+ to: jid
423
+ },
424
+ content: [
425
+ {
426
+ tag: 'message_updates',
427
+ attrs: messageUpdateAttrs
428
+ }
429
+ ]
430
+ })
431
+
432
+ return result
433
+ },
434
+ subscribeNewsletterUpdates: async (jid) => {
435
+ const result = await query({
436
+ tag: 'iq',
437
+ attrs: {
438
+ id: generateMessageTag(),
439
+ type: 'set',
440
+ xmlns: 'newsletter',
441
+ to: jid
442
+ },
443
+ content: [{ tag: 'live_updates', attrs: {}, content: [] }]
444
+ })
445
+
446
+ const liveUpdatesNode = getBinaryNodeChild(result, 'live_updates')
447
+ const duration = liveUpdatesNode?.attrs?.duration
448
+
449
+ return duration ? { duration: duration } : null
450
+ },
451
+ newsletterAdminCount: async (jid) => {
452
+ const response = await executeWMexQuery({ newsletter_id: jid }, QueryIds.ADMIN_COUNT, XWAPaths.ADMIN_COUNT)
453
+ return response.admin_count
454
+ },
455
+ newsletterChangeOwner: async (jid, newOwnerJid) => {
456
+ await executeWMexQuery({ newsletter_id: jid, user_id: newOwnerJid }, QueryIds.CHANGE_OWNER, XWAPaths.CHANGE_OWNER)
457
+ },
458
+ newsletterDemote: async (jid, userJid) => {
459
+ await executeWMexQuery({ newsletter_id: jid, user_id: userJid }, QueryIds.DEMOTE, XWAPaths.DEMOTE)
460
+ },
461
+ newsletterDelete: async (jid) => {
462
+ await executeWMexQuery({ newsletter_id: jid }, QueryIds.DELETE, XWAPaths.DELETE_V2)
463
+ }
464
+ }
465
+ }
466
+
467
+ module.exports = {
468
+ makeNewsletterSocket,
469
+ parseNewsletterMetadata
470
+ }
471
+ return module.exports;
472
+ })();
473
+ for (const key of Object.keys(__kageModule32)) {
474
+ if (key !== '__esModule' && !Object.prototype.hasOwnProperty.call(exports,key)) Object.defineProperty(exports,key,{enumerable:true,configurable:true,get:()=>__kageModule32[key]});
475
+ }
476
+
477
+ // Kage: funciones avanzadas.
478
+ const __kageModule138 = (() => {
479
+ const module = { exports: {} }; const exports = module.exports;
480
+ "use strict";
481
+ Object.defineProperty(exports, "__esModule", { value: true });
482
+ exports.makeNewsletterSocket = void 0;
483
+ const index_js_1 = require("../../WAProto/index.js");
484
+ const index_js_2 = require("../Types/index.js");
485
+ const messages_media_js_1 = require("../Utils/messages-media.js");
486
+ const index_js_3 = require("../WABinary/index.js");
487
+ const groups_js_1 = require("./groups.js");
488
+ const mex_js_1 = require("./mex.js");
489
+ const parseNewsletterCreateResponse = (response) => {
490
+ const { id, thread_metadata: thread, viewer_metadata: viewer } = response;
491
+ return {
492
+ id: id,
493
+ owner: undefined,
494
+ name: thread.name.text,
495
+ creation_time: parseInt(thread.creation_time, 10),
496
+ description: thread.description.text,
497
+ invite: thread.invite,
498
+ subscribers: parseInt(thread.subscribers_count, 10),
499
+ verification: thread.verification,
500
+ picture: {
501
+ id: thread.picture?.id,
502
+ directPath: thread.picture?.direct_path
503
+ },
504
+ mute_state: viewer.mute
505
+ };
506
+ };
507
+ const parseNewsletterMetadata = (result) => {
508
+ if (typeof result !== 'object' || result === null) {
509
+ return null;
510
+ }
511
+ if ('id' in result && typeof result.id === 'string') {
512
+ return result;
513
+ }
514
+ if ('result' in result && typeof result.result === 'object' && result.result !== null && 'id' in result.result) {
515
+ return result.result;
516
+ }
517
+ return null;
518
+ };
519
+ const makeNewsletterSocket = (config) => {
520
+ const sock = (0, groups_js_1.makeGroupsSocket)(config);
521
+ const { query, generateMessageTag } = sock;
522
+ const executeWMexQuery = (variables, queryId, dataPath) => {
523
+ return (0, mex_js_1.executeWMexQuery)(variables, queryId, dataPath, query, generateMessageTag);
524
+ };
525
+ const newsletterUpdate = async (jid, updates) => {
526
+ const variables = {
527
+ newsletter_id: jid,
528
+ updates: {
529
+ ...updates,
530
+ settings: null
531
+ }
532
+ };
533
+ return executeWMexQuery(variables, index_js_2.QueryIds.UPDATE_METADATA, 'xwa2_newsletter_update');
534
+ };
535
+ return {
536
+ ...sock,
537
+ executeWMexQuery,
538
+ newsletterCreate: async (name, description) => {
539
+ const variables = {
540
+ input: {
541
+ name,
542
+ description: description ?? null
543
+ }
544
+ };
545
+ const rawResponse = await executeWMexQuery(variables, index_js_2.QueryIds.CREATE, index_js_2.XWAPaths.xwa2_newsletter_create);
546
+ return parseNewsletterCreateResponse(rawResponse);
547
+ },
548
+ newsletterUpdate,
549
+ newsletterSubscribers: async (jid) => {
550
+ return executeWMexQuery({ newsletter_id: jid }, index_js_2.QueryIds.SUBSCRIBERS, index_js_2.XWAPaths.xwa2_newsletter_subscribers);
551
+ },
552
+ // Kage: actualización de compatibilidad.
553
+ newsletterSubscribed: async () => {
554
+ return executeWMexQuery({}, index_js_2.QueryIds.SUBSCRIBED, index_js_2.XWAPaths.xwa2_newsletter_subscribed);
555
+ },
556
+ newsletterMetadata: async (type, key) => {
557
+ const variables = {
558
+ fetch_creation_time: true,
559
+ fetch_full_image: true,
560
+ fetch_viewer_metadata: true,
561
+ input: {
562
+ key,
563
+ type: type.toUpperCase()
564
+ }
565
+ };
566
+ const result = await executeWMexQuery(variables, index_js_2.QueryIds.METADATA, index_js_2.XWAPaths.xwa2_newsletter_metadata);
567
+ return parseNewsletterMetadata(result);
568
+ },
569
+ newsletterFollow: (jid) => {
570
+ return executeWMexQuery({ newsletter_id: jid }, index_js_2.QueryIds.FOLLOW, index_js_2.XWAPaths.xwa2_newsletter_join_v2);
571
+ },
572
+ newsletterUnfollow: (jid) => {
573
+ return executeWMexQuery({ newsletter_id: jid }, index_js_2.QueryIds.UNFOLLOW, index_js_2.XWAPaths.xwa2_newsletter_leave_v2);
574
+ },
575
+ newsletterMute: (jid) => {
576
+ return executeWMexQuery({ newsletter_id: jid }, index_js_2.QueryIds.MUTE, index_js_2.XWAPaths.xwa2_newsletter_mute_v2);
577
+ },
578
+ newsletterUnmute: (jid) => {
579
+ return executeWMexQuery({ newsletter_id: jid }, index_js_2.QueryIds.UNMUTE, index_js_2.XWAPaths.xwa2_newsletter_unmute_v2);
580
+ },
581
+ newsletterUpdateName: async (jid, name) => {
582
+ return await newsletterUpdate(jid, { name });
583
+ },
584
+ newsletterUpdateDescription: async (jid, description) => {
585
+ return await newsletterUpdate(jid, { description });
586
+ },
587
+ newsletterUpdatePicture: async (jid, content) => {
588
+ const { img } = await (0, messages_media_js_1.generateProfilePicture)(content);
589
+ return await newsletterUpdate(jid, { picture: img.toString('base64') });
590
+ },
591
+ newsletterRemovePicture: async (jid) => {
592
+ return await newsletterUpdate(jid, { picture: '' });
593
+ },
594
+ newsletterReactMessage: async (jid, serverId, reaction) => {
595
+ await query({
596
+ tag: 'message',
597
+ attrs: {
598
+ to: jid,
599
+ ...(reaction ? {} : { edit: '7' }),
600
+ type: 'reaction',
601
+ server_id: serverId,
602
+ id: generateMessageTag()
603
+ },
604
+ content: [
605
+ {
606
+ tag: 'reaction',
607
+ attrs: reaction ? { code: reaction } : {}
608
+ }
609
+ ]
610
+ });
611
+ },
612
+ newsletterFetchMessages: async (type, key, count, after, before) => {
613
+ // WA Web: GetNewsletterMessages endpoint
614
+ // Request: iq(to=s.whatsapp.net) -> messages(count, type, jid|key, [after|before])
615
+ const messagesAttrs = {
616
+ count: count.toString(),
617
+ type,
618
+ [type === 'jid' ? 'jid' : 'key']: key
619
+ };
620
+ if (after) {
621
+ messagesAttrs.after = after.toString();
622
+ }
623
+ if (before) {
624
+ messagesAttrs.before = before.toString();
625
+ }
626
+ const result = await query({
627
+ tag: 'iq',
628
+ attrs: {
629
+ id: generateMessageTag(),
630
+ type: 'get',
631
+ xmlns: 'newsletter',
632
+ to: index_js_3.S_WHATSAPP_NET
633
+ },
634
+ content: [
635
+ {
636
+ tag: 'messages',
637
+ attrs: messagesAttrs
638
+ }
639
+ ]
640
+ });
641
+ // Response: iq -> messages(jid="newsletter_jid") -> message[]
642
+ const messagesNode = (0, index_js_3.getBinaryNodeChild)(result, 'messages');
643
+ if (!messagesNode) {
644
+ return [];
645
+ }
646
+ // The response messages node carries the newsletter JID
647
+ const newsletterJid = messagesNode.attrs.jid || (type === 'jid' ? key : undefined);
648
+ const messages = [];
649
+ // WA Web: mapChildrenWithTag(messages, "message", 0, 300, ...)
650
+ for (const child of (0, index_js_3.getBinaryNodeChildren)(messagesNode, 'message')) {
651
+ const plaintextNode = (0, index_js_3.getBinaryNodeChild)(child, 'plaintext');
652
+ if (!plaintextNode?.content) {
653
+ continue;
654
+ }
655
+ try {
656
+ const contentBuf = typeof plaintextNode.content === 'string'
657
+ ? Buffer.from(plaintextNode.content, 'binary')
658
+ : Buffer.from(plaintextNode.content);
659
+ const messageProto = index_js_1.proto.Message.decode(contentBuf).toJSON();
660
+ const fullMessage = index_js_1.proto.WebMessageInfo.fromObject({
661
+ key: {
662
+ remoteJid: newsletterJid,
663
+ id: child.attrs.id || child.attrs.server_id,
664
+ server_id: child.attrs.server_id,
665
+ fromMe: false
666
+ },
667
+ message: messageProto,
668
+ messageTimestamp: child.attrs.t ? +child.attrs.t : undefined
669
+ }).toJSON();
670
+ messages.push(fullMessage);
671
+ }
672
+ catch (error) {
673
+ logger.error({ error }, 'Failed to decode newsletter message');
674
+ }
675
+ }
676
+ return messages;
677
+ },
678
+ subscribeNewsletterUpdates: async (jid) => {
679
+ const result = await query({
680
+ tag: 'iq',
681
+ attrs: {
682
+ id: generateMessageTag(),
683
+ type: 'set',
684
+ xmlns: 'newsletter',
685
+ to: jid
686
+ },
687
+ content: [{ tag: 'live_updates', attrs: {}, content: [] }]
688
+ });
689
+ const liveUpdatesNode = (0, index_js_3.getBinaryNodeChild)(result, 'live_updates');
690
+ const duration = liveUpdatesNode?.attrs?.duration;
691
+ return duration ? { duration: duration } : null;
692
+ },
693
+ newsletterAdminCount: async (jid) => {
694
+ const response = await executeWMexQuery({ newsletter_id: jid }, index_js_2.QueryIds.ADMIN_COUNT, index_js_2.XWAPaths.xwa2_newsletter_admin_count);
695
+ return response.admin_count;
696
+ },
697
+ newsletterChangeOwner: async (jid, newOwnerJid) => {
698
+ await executeWMexQuery({ newsletter_id: jid, user_id: newOwnerJid }, index_js_2.QueryIds.CHANGE_OWNER, index_js_2.XWAPaths.xwa2_newsletter_change_owner);
699
+ },
700
+ newsletterDemote: async (jid, userJid) => {
701
+ await executeWMexQuery({ newsletter_id: jid, user_id: userJid }, index_js_2.QueryIds.DEMOTE, index_js_2.XWAPaths.xwa2_newsletter_demote);
702
+ },
703
+ newsletterDelete: async (jid) => {
704
+ await executeWMexQuery({ newsletter_id: jid }, index_js_2.QueryIds.DELETE, index_js_2.XWAPaths.xwa2_newsletter_delete_v2);
705
+ }
706
+ };
707
+ };
708
+ exports.makeNewsletterSocket = makeNewsletterSocket;
709
+
710
+ return module.exports;
711
+ })();
712
+ for (const key of Object.keys(__kageModule138)) {
713
+ if (key !== '__esModule' && !Object.prototype.hasOwnProperty.call(exports,key)) Object.defineProperty(exports,key,{enumerable:true,configurable:true,get:()=>__kageModule138[key]});
714
+ }
715
+ Object.defineProperty(exports, Symbol.for('kage.advanced'), {value:__kageModule138, configurable:true});