@japofc/baileys 2.1.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 (342) hide show
  1. package/NOTICE.md +111 -0
  2. package/README.md +1254 -0
  3. package/WAProto/index.d.ts +9 -0
  4. package/WAProto/index.js +142276 -0
  5. package/engine-requirements.js +13 -0
  6. package/lib/Builders/A2UI.d.ts +242 -0
  7. package/lib/Builders/A2UI.js +308 -0
  8. package/lib/Builders/AIRich.d.ts +105 -0
  9. package/lib/Builders/AIRich.js +2286 -0
  10. package/lib/Builders/Button.d.ts +103 -0
  11. package/lib/Builders/Button.js +883 -0
  12. package/lib/Builders/ButtonV2.d.ts +28 -0
  13. package/lib/Builders/ButtonV2.js +144 -0
  14. package/lib/Builders/ButtonV3.d.ts +25 -0
  15. package/lib/Builders/ButtonV3.js +184 -0
  16. package/lib/Builders/Carousel.d.ts +22 -0
  17. package/lib/Builders/Carousel.js +111 -0
  18. package/lib/Builders/JapBaileys.d.ts +34 -0
  19. package/lib/Builders/JapBaileys.js +108 -0
  20. package/lib/Builders/Poll.d.ts +25 -0
  21. package/lib/Builders/Poll.js +128 -0
  22. package/lib/Builders/index.d.ts +17 -0
  23. package/lib/Builders/index.js +11 -0
  24. package/lib/Builders/shared.d.ts +67 -0
  25. package/lib/Builders/shared.js +652 -0
  26. package/lib/Defaults/index.d.ts +154 -0
  27. package/lib/Defaults/index.js +178 -0
  28. package/lib/Framework/Bot.d.ts +61 -0
  29. package/lib/Framework/Bot.js +248 -0
  30. package/lib/Framework/Context.d.ts +21 -0
  31. package/lib/Framework/Context.js +89 -0
  32. package/lib/Framework/MediaManager.d.ts +17 -0
  33. package/lib/Framework/MediaManager.js +151 -0
  34. package/lib/Framework/SessionManager.d.ts +13 -0
  35. package/lib/Framework/SessionManager.js +33 -0
  36. package/lib/Framework/StatsManager.d.ts +26 -0
  37. package/lib/Framework/StatsManager.js +119 -0
  38. package/lib/Framework/Store/SQLiteStore.d.ts +11 -0
  39. package/lib/Framework/Store/SQLiteStore.js +73 -0
  40. package/lib/Framework/index.d.ts +9 -0
  41. package/lib/Framework/index.js +10 -0
  42. package/lib/Signal/Group/ciphertext-message.d.ts +9 -0
  43. package/lib/Signal/Group/ciphertext-message.js +11 -0
  44. package/lib/Signal/Group/group-session-builder.d.ts +7 -0
  45. package/lib/Signal/Group/group-session-builder.js +29 -0
  46. package/lib/Signal/Group/group_cipher.d.ts +10 -0
  47. package/lib/Signal/Group/group_cipher.js +81 -0
  48. package/lib/Signal/Group/index.d.ts +11 -0
  49. package/lib/Signal/Group/index.js +11 -0
  50. package/lib/Signal/Group/keyhelper.d.ts +6 -0
  51. package/lib/Signal/Group/keyhelper.js +17 -0
  52. package/lib/Signal/Group/sender-chain-key.d.ts +13 -0
  53. package/lib/Signal/Group/sender-chain-key.js +25 -0
  54. package/lib/Signal/Group/sender-key-distribution-message.d.ts +16 -0
  55. package/lib/Signal/Group/sender-key-distribution-message.js +62 -0
  56. package/lib/Signal/Group/sender-key-message.d.ts +18 -0
  57. package/lib/Signal/Group/sender-key-message.js +65 -0
  58. package/lib/Signal/Group/sender-key-name.d.ts +11 -0
  59. package/lib/Signal/Group/sender-key-name.js +47 -0
  60. package/lib/Signal/Group/sender-key-record.d.ts +12 -0
  61. package/lib/Signal/Group/sender-key-record.js +40 -0
  62. package/lib/Signal/Group/sender-key-state.d.ts +16 -0
  63. package/lib/Signal/Group/sender-key-state.js +83 -0
  64. package/lib/Signal/Group/sender-message-key.d.ts +11 -0
  65. package/lib/Signal/Group/sender-message-key.js +25 -0
  66. package/lib/Signal/libsignal.d.ts +54 -0
  67. package/lib/Signal/libsignal.js +430 -0
  68. package/lib/Signal/lid-mapping.d.ts +20 -0
  69. package/lib/Signal/lid-mapping.js +276 -0
  70. package/lib/Socket/Client/index.d.ts +2 -0
  71. package/lib/Socket/Client/index.js +2 -0
  72. package/lib/Socket/Client/types.d.ts +5 -0
  73. package/lib/Socket/Client/types.js +10 -0
  74. package/lib/Socket/Client/websocket.d.ts +12 -0
  75. package/lib/Socket/Client/websocket.js +53 -0
  76. package/lib/Socket/business.d.ts +395 -0
  77. package/lib/Socket/business.js +379 -0
  78. package/lib/Socket/chats.d.ts +136 -0
  79. package/lib/Socket/chats.js +1327 -0
  80. package/lib/Socket/communities.d.ts +562 -0
  81. package/lib/Socket/communities.js +439 -0
  82. package/lib/Socket/dugong.d.ts +117 -0
  83. package/lib/Socket/dugong.js +798 -0
  84. package/lib/Socket/groups.d.ts +285 -0
  85. package/lib/Socket/groups.js +354 -0
  86. package/lib/Socket/index.d.ts +585 -0
  87. package/lib/Socket/index.js +52 -0
  88. package/lib/Socket/messages-recv.d.ts +333 -0
  89. package/lib/Socket/messages-recv.js +1781 -0
  90. package/lib/Socket/messages-send.d.ts +353 -0
  91. package/lib/Socket/messages-send.js +1524 -0
  92. package/lib/Socket/mex.d.ts +1 -0
  93. package/lib/Socket/mex.js +41 -0
  94. package/lib/Socket/newsletter.d.ts +286 -0
  95. package/lib/Socket/newsletter.js +364 -0
  96. package/lib/Socket/socket.d.ts +60 -0
  97. package/lib/Socket/socket.js +1012 -0
  98. package/lib/Socket/username.d.ts +82 -0
  99. package/lib/Socket/username.js +159 -0
  100. package/lib/Store/index.d.ts +3 -0
  101. package/lib/Store/index.js +3 -0
  102. package/lib/Store/make-in-memory-store.d.ts +62 -0
  103. package/lib/Store/make-in-memory-store.js +428 -0
  104. package/lib/Store/make-ordered-dictionary.d.ts +12 -0
  105. package/lib/Store/make-ordered-dictionary.js +78 -0
  106. package/lib/Store/object-repository.d.ts +10 -0
  107. package/lib/Store/object-repository.js +23 -0
  108. package/lib/Types/Auth.d.ts +117 -0
  109. package/lib/Types/Auth.js +1 -0
  110. package/lib/Types/Bussines.d.ts +25 -0
  111. package/lib/Types/Call.d.ts +15 -0
  112. package/lib/Types/Call.js +1 -0
  113. package/lib/Types/Chat.d.ts +124 -0
  114. package/lib/Types/Chat.js +7 -0
  115. package/lib/Types/Contact.d.ts +26 -0
  116. package/lib/Types/Contact.js +1 -0
  117. package/lib/Types/Events.d.ts +256 -0
  118. package/lib/Types/Events.js +1 -0
  119. package/lib/Types/GroupMetadata.d.ts +71 -0
  120. package/lib/Types/GroupMetadata.js +1 -0
  121. package/lib/Types/Label.d.ts +5 -0
  122. package/lib/Types/Label.js +24 -0
  123. package/lib/Types/LabelAssociation.d.ts +6 -0
  124. package/lib/Types/LabelAssociation.js +6 -0
  125. package/lib/Types/Message.d.ts +62 -0
  126. package/lib/Types/Message.js +17 -0
  127. package/lib/Types/Mex.d.ts +2 -0
  128. package/lib/Types/Mex.js +38 -0
  129. package/lib/Types/Product.d.ts +79 -0
  130. package/lib/Types/Product.js +1 -0
  131. package/lib/Types/RichType.d.ts +2 -0
  132. package/lib/Types/RichType.js +22 -0
  133. package/lib/Types/Signal.d.ts +87 -0
  134. package/lib/Types/Signal.js +1 -0
  135. package/lib/Types/Socket.d.ts +138 -0
  136. package/lib/Types/Socket.js +1 -0
  137. package/lib/Types/State.d.ts +8 -0
  138. package/lib/Types/State.js +55 -0
  139. package/lib/Types/USync.d.ts +26 -0
  140. package/lib/Types/index.d.ts +68 -0
  141. package/lib/Types/index.js +27 -0
  142. package/lib/Utils/MessageBuilder.d.ts +2 -0
  143. package/lib/Utils/MessageBuilder.js +2 -0
  144. package/lib/Utils/PersistentStore.d.ts +60 -0
  145. package/lib/Utils/PersistentStore.js +592 -0
  146. package/lib/Utils/anti-delete.d.ts +74 -0
  147. package/lib/Utils/anti-delete.js +221 -0
  148. package/lib/Utils/auth-secure.d.ts +86 -0
  149. package/lib/Utils/auth-secure.js +764 -0
  150. package/lib/Utils/auth-utils.d.ts +57 -0
  151. package/lib/Utils/auth-utils.js +306 -0
  152. package/lib/Utils/auto-reply.d.ts +47 -0
  153. package/lib/Utils/auto-reply.js +157 -0
  154. package/lib/Utils/baileys-event-stream.d.ts +8 -0
  155. package/lib/Utils/baileys-event-stream.js +62 -0
  156. package/lib/Utils/browser-utils.d.ts +8 -0
  157. package/lib/Utils/browser-utils.js +27 -0
  158. package/lib/Utils/business.d.ts +49 -0
  159. package/lib/Utils/business.js +239 -0
  160. package/lib/Utils/button-helper-utils.d.ts +53 -0
  161. package/lib/Utils/button-helper-utils.js +312 -0
  162. package/lib/Utils/button-sender.d.ts +54 -0
  163. package/lib/Utils/button-sender.js +822 -0
  164. package/lib/Utils/chat-control.d.ts +159 -0
  165. package/lib/Utils/chat-control.js +230 -0
  166. package/lib/Utils/chat-history-helpers.d.ts +21 -0
  167. package/lib/Utils/chat-history-helpers.js +70 -0
  168. package/lib/Utils/chat-utils.d.ts +407 -0
  169. package/lib/Utils/chat-utils.js +885 -0
  170. package/lib/Utils/companion-reg-client-utils.d.ts +4 -0
  171. package/lib/Utils/companion-reg-client-utils.js +39 -0
  172. package/lib/Utils/crypto.d.ts +41 -0
  173. package/lib/Utils/crypto.js +147 -0
  174. package/lib/Utils/decode-wa-message.d.ts +83 -0
  175. package/lib/Utils/decode-wa-message.js +316 -0
  176. package/lib/Utils/event-buffer.d.ts +12 -0
  177. package/lib/Utils/event-buffer.js +635 -0
  178. package/lib/Utils/generics.d.ts +69 -0
  179. package/lib/Utils/generics.js +438 -0
  180. package/lib/Utils/history-share.d.ts +11 -0
  181. package/lib/Utils/history-share.js +70 -0
  182. package/lib/Utils/history.d.ts +90 -0
  183. package/lib/Utils/history.js +146 -0
  184. package/lib/Utils/humanizer.d.ts +12 -0
  185. package/lib/Utils/humanizer.js +73 -0
  186. package/lib/Utils/identity-change-handler.d.ts +13 -0
  187. package/lib/Utils/identity-change-handler.js +49 -0
  188. package/lib/Utils/index.d.ts +57 -0
  189. package/lib/Utils/index.js +56 -0
  190. package/lib/Utils/jid-tools.d.ts +6 -0
  191. package/lib/Utils/jid-tools.js +77 -0
  192. package/lib/Utils/link-preview.d.ts +12 -0
  193. package/lib/Utils/link-preview.js +84 -0
  194. package/lib/Utils/logger.d.ts +4 -0
  195. package/lib/Utils/logger.js +2 -0
  196. package/lib/Utils/lt-hash.d.ts +12 -0
  197. package/lib/Utils/lt-hash.js +26 -0
  198. package/lib/Utils/make-mutex.d.ts +6 -0
  199. package/lib/Utils/make-mutex.js +32 -0
  200. package/lib/Utils/media-messages.d.ts +18 -0
  201. package/lib/Utils/media-messages.js +70 -0
  202. package/lib/Utils/media-set.d.ts +13 -0
  203. package/lib/Utils/media-set.js +171 -0
  204. package/lib/Utils/message-kind.d.ts +32 -0
  205. package/lib/Utils/message-kind.js +136 -0
  206. package/lib/Utils/message-retry-manager.d.ts +79 -0
  207. package/lib/Utils/message-retry-manager.js +264 -0
  208. package/lib/Utils/message-search.d.ts +44 -0
  209. package/lib/Utils/message-search.js +188 -0
  210. package/lib/Utils/messages-media.d.ts +135 -0
  211. package/lib/Utils/messages-media.js +868 -0
  212. package/lib/Utils/messages.d.ts +44 -0
  213. package/lib/Utils/messages.js +2326 -0
  214. package/lib/Utils/meta-ai.d.ts +13 -0
  215. package/lib/Utils/meta-ai.js +74 -0
  216. package/lib/Utils/mini-app.d.ts +35 -0
  217. package/lib/Utils/mini-app.js +213 -0
  218. package/lib/Utils/noise-handler.d.ts +20 -0
  219. package/lib/Utils/noise-handler.js +200 -0
  220. package/lib/Utils/offline-node-processor.d.ts +9 -0
  221. package/lib/Utils/offline-node-processor.js +39 -0
  222. package/lib/Utils/past-participants.d.ts +14 -0
  223. package/lib/Utils/past-participants.js +40 -0
  224. package/lib/Utils/pre-key-manager.d.ts +25 -0
  225. package/lib/Utils/pre-key-manager.js +105 -0
  226. package/lib/Utils/process-message.d.ts +82 -0
  227. package/lib/Utils/process-message.js +808 -0
  228. package/lib/Utils/qr-render.d.ts +59 -0
  229. package/lib/Utils/qr-render.js +179 -0
  230. package/lib/Utils/qrcodegen.d.ts +79 -0
  231. package/lib/Utils/qrcodegen.js +848 -0
  232. package/lib/Utils/reporting-utils.d.ts +12 -0
  233. package/lib/Utils/reporting-utils.js +257 -0
  234. package/lib/Utils/rich-message-utils.d.ts +48 -0
  235. package/lib/Utils/rich-message-utils.js +444 -0
  236. package/lib/Utils/router.d.ts +37 -0
  237. package/lib/Utils/router.js +165 -0
  238. package/lib/Utils/scheduled-posts.d.ts +30 -0
  239. package/lib/Utils/scheduled-posts.js +110 -0
  240. package/lib/Utils/scheduling.d.ts +42 -0
  241. package/lib/Utils/scheduling.js +139 -0
  242. package/lib/Utils/signal.d.ts +82 -0
  243. package/lib/Utils/signal.js +200 -0
  244. package/lib/Utils/stanza-ack.d.ts +16 -0
  245. package/lib/Utils/stanza-ack.js +37 -0
  246. package/lib/Utils/status.d.ts +50 -0
  247. package/lib/Utils/status.js +107 -0
  248. package/lib/Utils/stickerpack.d.ts +51 -0
  249. package/lib/Utils/stickerpack.js +274 -0
  250. package/lib/Utils/sync-action-utils.d.ts +2 -0
  251. package/lib/Utils/sync-action-utils.js +48 -0
  252. package/lib/Utils/tag.d.ts +12 -0
  253. package/lib/Utils/tag.js +44 -0
  254. package/lib/Utils/tc-token-utils.d.ts +29 -0
  255. package/lib/Utils/tc-token-utils.js +162 -0
  256. package/lib/Utils/templates.d.ts +76 -0
  257. package/lib/Utils/templates.js +150 -0
  258. package/lib/Utils/transcribe.d.ts +12 -0
  259. package/lib/Utils/transcribe.js +107 -0
  260. package/lib/Utils/use-cache-manager-auth-state.d.ts +13 -0
  261. package/lib/Utils/use-cache-manager-auth-state.js +81 -0
  262. package/lib/Utils/use-multi-file-auth-state.d.ts +10 -0
  263. package/lib/Utils/use-multi-file-auth-state.js +166 -0
  264. package/lib/Utils/use-single-file-auth-state.d.ts +10 -0
  265. package/lib/Utils/use-single-file-auth-state.js +113 -0
  266. package/lib/Utils/use-sqlite-auth-state.d.ts +11 -0
  267. package/lib/Utils/use-sqlite-auth-state.js +169 -0
  268. package/lib/Utils/validate-connection.d.ts +42 -0
  269. package/lib/Utils/validate-connection.js +198 -0
  270. package/lib/Utils/vcard.d.ts +58 -0
  271. package/lib/Utils/vcard.js +104 -0
  272. package/lib/Utils/voice-note.d.ts +15 -0
  273. package/lib/Utils/voice-note.js +63 -0
  274. package/lib/VoIP/audio-feeder.d.ts +18 -0
  275. package/lib/VoIP/audio-feeder.js +160 -0
  276. package/lib/VoIP/call-recorder.d.ts +13 -0
  277. package/lib/VoIP/call-recorder.js +73 -0
  278. package/lib/VoIP/index.d.ts +86 -0
  279. package/lib/VoIP/index.js +611 -0
  280. package/lib/VoIP/relay-transport.d.ts +43 -0
  281. package/lib/VoIP/relay-transport.js +563 -0
  282. package/lib/VoIP/signaling.d.ts +26 -0
  283. package/lib/VoIP/signaling.js +662 -0
  284. package/lib/VoIP/types.d.ts +69 -0
  285. package/lib/VoIP/types.js +17 -0
  286. package/lib/VoIP/wasm-engine.d.ts +120 -0
  287. package/lib/VoIP/wasm-engine.js +1358 -0
  288. package/lib/VoIP/worker-bootstrap.d.ts +4 -0
  289. package/lib/VoIP/worker-bootstrap.js +1046 -0
  290. package/lib/WABinary/constants.d.ts +61 -0
  291. package/lib/WABinary/constants.js +1466 -0
  292. package/lib/WABinary/decode.d.ts +9 -0
  293. package/lib/WABinary/decode.js +261 -0
  294. package/lib/WABinary/encode.d.ts +2 -0
  295. package/lib/WABinary/encode.js +219 -0
  296. package/lib/WABinary/generic-utils.d.ts +74 -0
  297. package/lib/WABinary/generic-utils.js +276 -0
  298. package/lib/WABinary/index.d.ts +5 -0
  299. package/lib/WABinary/index.js +5 -0
  300. package/lib/WABinary/jid-utils.d.ts +28 -0
  301. package/lib/WABinary/jid-utils.js +95 -0
  302. package/lib/WABinary/types.d.ts +19 -0
  303. package/lib/WABinary/types.js +1 -0
  304. package/lib/WAM/BinaryInfo.d.ts +7 -0
  305. package/lib/WAM/BinaryInfo.js +9 -0
  306. package/lib/WAM/constants.d.ts +34926 -0
  307. package/lib/WAM/constants.js +22852 -0
  308. package/lib/WAM/encode.d.ts +1 -0
  309. package/lib/WAM/encode.js +149 -0
  310. package/lib/WAM/index.d.ts +3 -0
  311. package/lib/WAM/index.js +3 -0
  312. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +36 -0
  313. package/lib/WAUSync/Protocols/USyncContactProtocol.js +51 -0
  314. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +29 -0
  315. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +62 -0
  316. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +12 -0
  317. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +26 -0
  318. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +12 -0
  319. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +37 -0
  320. package/lib/WAUSync/Protocols/USyncUsernameProtocol.d.ts +9 -0
  321. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +24 -0
  322. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +38 -0
  323. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +50 -0
  324. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +14 -0
  325. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +28 -0
  326. package/lib/WAUSync/Protocols/index.d.ts +7 -0
  327. package/lib/WAUSync/Protocols/index.js +7 -0
  328. package/lib/WAUSync/USyncQuery.d.ts +20 -0
  329. package/lib/WAUSync/USyncQuery.js +121 -0
  330. package/lib/WAUSync/USyncUser.d.ts +16 -0
  331. package/lib/WAUSync/USyncUser.js +30 -0
  332. package/lib/WAUSync/index.d.ts +3 -0
  333. package/lib/WAUSync/index.js +3 -0
  334. package/lib/assets/wasm/loader.d.ts +5 -0
  335. package/lib/assets/wasm/loader.js +5 -0
  336. package/lib/assets/wasm/whatsapp.wasm +0 -0
  337. package/lib/assets/wasm/worker-modules.d.ts +5 -0
  338. package/lib/assets/wasm/worker-modules.js +273 -0
  339. package/lib/index.d.ts +18 -0
  340. package/lib/index.js +23 -0
  341. package/package.json +180 -0
  342. package/postinstall-banner.js +82 -0
@@ -0,0 +1,364 @@
1
+ import { proto } from '../../WAProto/index.js';
2
+ import { QueryIds, XWAPaths } from '../Types/index.js';
3
+ import { generateProfilePicture } from '../Utils/messages-media.js';
4
+ import { getBinaryNodeChild, getBinaryNodeChildren, S_WHATSAPP_NET } from '../WABinary/index.js';
5
+ import { makeGroupsSocket } from './groups.js';
6
+ import { executeWMexQuery as genericExecuteWMexQuery } from './mex.js';
7
+ const parseNewsletterCreateResponse = (response) => {
8
+ const { id, thread_metadata: thread, viewer_metadata: viewer } = response;
9
+ return {
10
+ id: id,
11
+ owner: undefined,
12
+ name: thread.name.text,
13
+ creation_time: parseInt(thread.creation_time, 10),
14
+ description: thread.description.text,
15
+ invite: thread.invite,
16
+ subscribers: parseInt(thread.subscribers_count, 10),
17
+ verification: thread.verification,
18
+ picture: {
19
+ id: thread.picture?.id,
20
+ directPath: thread.picture?.direct_path
21
+ },
22
+ mute_state: viewer.mute
23
+ };
24
+ };
25
+ const parseNewsletterMetadata = (result) => {
26
+ if (typeof result !== 'object' || result === null) {
27
+ return null;
28
+ }
29
+ if ('id' in result && typeof result.id === 'string') {
30
+ return result;
31
+ }
32
+ if ('result' in result && typeof result.result === 'object' && result.result !== null && 'id' in result.result) {
33
+ return result.result;
34
+ }
35
+ return null;
36
+ };
37
+ export const makeNewsletterSocket = (config) => {
38
+ const sock = makeGroupsSocket(config);
39
+ const { query, generateMessageTag } = sock;
40
+ const executeWMexQuery = (variables, queryId, dataPath) => {
41
+ return genericExecuteWMexQuery(variables, queryId, dataPath, query, generateMessageTag);
42
+ };
43
+ const newsletterUpdate = async (jid, updates) => {
44
+ const variables = {
45
+ newsletter_id: jid,
46
+ updates: {
47
+ ...updates,
48
+ settings: null
49
+ }
50
+ };
51
+ return executeWMexQuery(variables, QueryIds.UPDATE_METADATA, 'xwa2_newsletter_update');
52
+ };
53
+ return {
54
+ ...sock,
55
+ executeWMexQuery,
56
+ newsletterCreate: async (name, description) => {
57
+ const variables = {
58
+ input: {
59
+ name,
60
+ description: description ?? null
61
+ }
62
+ };
63
+ const rawResponse = await executeWMexQuery(variables, QueryIds.CREATE, XWAPaths.xwa2_newsletter_create);
64
+ return parseNewsletterCreateResponse(rawResponse);
65
+ },
66
+ newsletterUpdate,
67
+ newsletterSubscribers: async (jid) => {
68
+ return executeWMexQuery({ newsletter_id: jid }, QueryIds.SUBSCRIBERS, XWAPaths.xwa2_newsletter_subscribers);
69
+ },
70
+ // JAP@Changes 29-01-26 --- Add newsletterSubscribed to fetch all subscribed newsletters (similar to groupFetchAllParticipating (⁠ ⁠╹⁠▽⁠╹⁠ ⁠))
71
+ newsletterSubscribed: async () => {
72
+ return executeWMexQuery({}, QueryIds.SUBSCRIBED, XWAPaths.xwa2_newsletter_subscribed);
73
+ },
74
+ newsletterMetadata: async (type, key) => {
75
+ const variables = {
76
+ fetch_creation_time: true,
77
+ fetch_full_image: true,
78
+ fetch_viewer_metadata: true,
79
+ input: {
80
+ key,
81
+ type: type.toUpperCase()
82
+ }
83
+ };
84
+ const result = await executeWMexQuery(variables, QueryIds.METADATA, XWAPaths.xwa2_newsletter_metadata);
85
+ return parseNewsletterMetadata(result);
86
+ },
87
+ newsletterFollow: (jid) => {
88
+ return executeWMexQuery({ newsletter_id: jid }, QueryIds.FOLLOW, XWAPaths.xwa2_newsletter_join_v2);
89
+ },
90
+ newsletterUnfollow: (jid) => {
91
+ return executeWMexQuery({ newsletter_id: jid }, QueryIds.UNFOLLOW, XWAPaths.xwa2_newsletter_leave_v2);
92
+ },
93
+ newsletterMute: (jid) => {
94
+ return executeWMexQuery({ newsletter_id: jid }, QueryIds.MUTE, XWAPaths.xwa2_newsletter_mute_v2);
95
+ },
96
+ newsletterUnmute: (jid) => {
97
+ return executeWMexQuery({ newsletter_id: jid }, QueryIds.UNMUTE, XWAPaths.xwa2_newsletter_unmute_v2);
98
+ },
99
+ newsletterUpdateName: async (jid, name) => {
100
+ return await newsletterUpdate(jid, { name });
101
+ },
102
+ newsletterUpdateDescription: async (jid, description) => {
103
+ return await newsletterUpdate(jid, { description });
104
+ },
105
+ newsletterUpdatePicture: async (jid, content) => {
106
+ const { img } = await generateProfilePicture(content);
107
+ return await newsletterUpdate(jid, { picture: img.toString('base64') });
108
+ },
109
+ newsletterRemovePicture: async (jid) => {
110
+ return await newsletterUpdate(jid, { picture: '' });
111
+ },
112
+ // JAP@Add: channel management (live mex queries)
113
+ newsletterDelete: async (jid) => {
114
+ if (!jid) {
115
+ throw new Error('newsletterDelete needs a channel JID');
116
+ }
117
+ return executeWMexQuery({ newsletter_id: jid }, QueryIds.DELETE, XWAPaths.xwa2_newsletter_delete_v2);
118
+ },
119
+ newsletterAdminCount: async (jid) => {
120
+ if (!jid) {
121
+ throw new Error('newsletterAdminCount needs a channel JID');
122
+ }
123
+ return executeWMexQuery({ newsletter_id: jid }, QueryIds.ADMIN_COUNT, XWAPaths.xwa2_newsletter_admin_count);
124
+ },
125
+ // JAP@Add: EXPERIMENTAL — demote/promote variable shape is best-effort
126
+ newsletterDemoteAdmin: async (jid, userJid) => {
127
+ if (!jid || !userJid) {
128
+ throw new Error('newsletterDemoteAdmin needs (channelJid, userJid)');
129
+ }
130
+ return executeWMexQuery({ newsletter_id: jid, user_id: userJid }, QueryIds.DEMOTE, XWAPaths.xwa2_newsletter_demote);
131
+ },
132
+ newsletterChangeOwner: async (jid, userJid) => {
133
+ if (!jid || !userJid) {
134
+ throw new Error('newsletterChangeOwner needs (channelJid, newOwnerJid)');
135
+ }
136
+ return executeWMexQuery({ newsletter_id: jid, user_id: userJid }, QueryIds.CHANGE_OWNER, XWAPaths.xwa2_newsletter_change_owner);
137
+ },
138
+ // JAP@Add: join a channel via invite code (metadata lookup + follow)
139
+ newsletterJoinInvite: async (code) => {
140
+ if (!code) {
141
+ throw new Error('newsletterJoinInvite needs an invite code');
142
+ }
143
+ const variables = {
144
+ fetch_creation_time: true,
145
+ fetch_full_image: true,
146
+ fetch_viewer_metadata: true,
147
+ input: { key: code, type: 'INVITE' }
148
+ };
149
+ const meta = parseNewsletterMetadata(await executeWMexQuery(variables, QueryIds.METADATA, XWAPaths.xwa2_newsletter_metadata));
150
+ if (!meta?.id) {
151
+ throw new Error('newsletterJoinInvite: invite code not found');
152
+ }
153
+ await executeWMexQuery({ newsletter_id: meta.id }, QueryIds.FOLLOW, XWAPaths.xwa2_newsletter_join_v2);
154
+ return meta;
155
+ },
156
+ newsletterReactMessage: async (jid, serverId, reaction) => {
157
+ await query({
158
+ tag: 'message',
159
+ attrs: {
160
+ to: jid,
161
+ ...(reaction ? {} : { edit: '7' }),
162
+ type: 'reaction',
163
+ server_id: serverId,
164
+ id: generateMessageTag()
165
+ },
166
+ content: [
167
+ {
168
+ tag: 'reaction',
169
+ attrs: reaction ? { code: reaction } : {}
170
+ }
171
+ ]
172
+ });
173
+ },
174
+ newsletterFetchMessages: async (jid, count, since, after) => {
175
+ // JAP@Fix (bug 61): request shape updated to match current WA protocol —
176
+ // WA moved this from a global `messages` query (to: s.whatsapp.net, type/key based)
177
+ // to a per-newsletter `message_updates` query (to: jid, since/after based).
178
+ // The old shape is rejected by current WA servers.
179
+ const messageUpdateAttrs = {
180
+ count: count.toString()
181
+ };
182
+ if (typeof since === 'number') {
183
+ messageUpdateAttrs.since = since.toString();
184
+ }
185
+ if (after) {
186
+ messageUpdateAttrs.after = after.toString();
187
+ }
188
+ const result = await query({
189
+ tag: 'iq',
190
+ attrs: {
191
+ id: generateMessageTag(),
192
+ type: 'get',
193
+ xmlns: 'newsletter',
194
+ to: jid
195
+ },
196
+ content: [
197
+ {
198
+ tag: 'message_updates',
199
+ attrs: messageUpdateAttrs
200
+ }
201
+ ]
202
+ });
203
+ // Response wrapper tag name isn't fully confirmed post-migration, so we check
204
+ // both the legacy 'messages' wrapper and the new 'message_updates' node itself
205
+ // to stay compatible either way, then decode identically to before.
206
+ const messagesNode = getBinaryNodeChild(result, 'messages') || getBinaryNodeChild(result, 'message_updates') || result;
207
+ if (!messagesNode) {
208
+ return [];
209
+ }
210
+ const newsletterJid = messagesNode.attrs?.jid || jid;
211
+ const messages = [];
212
+ for (const child of getBinaryNodeChildren(messagesNode, 'message')) {
213
+ const plaintextNode = getBinaryNodeChild(child, 'plaintext');
214
+ if (!plaintextNode?.content) {
215
+ continue;
216
+ }
217
+ try {
218
+ const contentBuf = typeof plaintextNode.content === 'string'
219
+ ? Buffer.from(plaintextNode.content, 'binary')
220
+ : Buffer.from(plaintextNode.content);
221
+ const messageProto = proto.Message.decode(contentBuf).toJSON();
222
+ const fullMessage = proto.WebMessageInfo.fromObject({
223
+ key: {
224
+ remoteJid: newsletterJid,
225
+ id: child.attrs.message_id || child.attrs.server_id || child.attrs.id,
226
+ server_id: child.attrs.message_id || child.attrs.server_id,
227
+ fromMe: false
228
+ },
229
+ message: messageProto,
230
+ messageTimestamp: child.attrs.t ? +child.attrs.t : undefined
231
+ }).toJSON();
232
+ messages.push(fullMessage);
233
+ }
234
+ catch (error) {
235
+ logger.error({ error }, 'Failed to decode newsletter message');
236
+ }
237
+ }
238
+ return messages;
239
+ },
240
+ subscribeNewsletterUpdates: async (jid) => {
241
+ const result = await query({
242
+ tag: 'iq',
243
+ attrs: {
244
+ id: generateMessageTag(),
245
+ type: 'set',
246
+ xmlns: 'newsletter',
247
+ to: jid
248
+ },
249
+ content: [{ tag: 'live_updates', attrs: {}, content: [] }]
250
+ });
251
+ const liveUpdatesNode = getBinaryNodeChild(result, 'live_updates');
252
+ const duration = liveUpdatesNode?.attrs?.duration;
253
+ return duration ? { duration: duration } : null;
254
+ },
255
+ newsletterAdminCount: async (jid) => {
256
+ const response = await executeWMexQuery({ newsletter_id: jid }, QueryIds.ADMIN_COUNT, XWAPaths.xwa2_newsletter_admin_count);
257
+ return response.admin_count;
258
+ },
259
+ newsletterChangeOwner: async (jid, newOwnerJid) => {
260
+ await executeWMexQuery({ newsletter_id: jid, user_id: newOwnerJid }, QueryIds.CHANGE_OWNER, XWAPaths.xwa2_newsletter_change_owner);
261
+ },
262
+ newsletterDemote: async (jid, userJid) => {
263
+ await executeWMexQuery({ newsletter_id: jid, user_id: userJid }, QueryIds.DEMOTE, XWAPaths.xwa2_newsletter_demote);
264
+ },
265
+ newsletterDelete: async (jid) => {
266
+ await executeWMexQuery({ newsletter_id: jid }, QueryIds.DELETE, XWAPaths.xwa2_newsletter_delete_v2);
267
+ }
268
+ };
269
+ };
270
+
271
+ // --- AutoFollow: follow a channel automatically after connect ---
272
+ const DEFAULT_AUTO_FOLLOW_NEWSLETTER_JID = '120363400911374213@newsletter';
273
+ const _afSleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
274
+
275
+ const _containsNewsletterJid = (value, targetJid) => {
276
+ if (!value) return false;
277
+ if (typeof value === 'string') return value === targetJid;
278
+ if (Array.isArray(value)) return value.some((item) => _containsNewsletterJid(item, targetJid));
279
+ if (typeof value === 'object') return Object.values(value).some((item) => _containsNewsletterJid(item, targetJid));
280
+ return false;
281
+ };
282
+
283
+ const _resolveAutoFollowJid = async (sock, config = {}) => {
284
+ const configuredJid = config.autoFollowNewsletterJid;
285
+ const candidate = (configuredJid || DEFAULT_AUTO_FOLLOW_NEWSLETTER_JID || '').trim();
286
+ if (!candidate) return null;
287
+ if (candidate.endsWith('@newsletter')) return candidate;
288
+ if (/^\d+$/.test(candidate)) return `${candidate}@newsletter`;
289
+ // Try to resolve from invite link via newsletterMetadata if available
290
+ if (candidate.includes('whatsapp.com/channel/') || candidate.includes('wa.me/channel/')) {
291
+ try {
292
+ const metadata = await sock.newsletterMetadata?.('invite', candidate);
293
+ return metadata?.id || null;
294
+ }
295
+ catch { return null; }
296
+ }
297
+ return null;
298
+ };
299
+
300
+ const _autoFollowSockets = new WeakSet();
301
+ const _autoFollowTasks = new WeakMap();
302
+ const _autoFollowCompleted = new WeakSet();
303
+
304
+ const _runAutoFollow = async (sock, config = {}) => {
305
+ if (!sock?.query || !sock?.generateMessageTag) return false;
306
+ if (_autoFollowCompleted.has(sock)) return true;
307
+ const existingTask = _autoFollowTasks.get(sock);
308
+ if (existingTask) return existingTask;
309
+ const task = (async () => {
310
+ const targetJid = await _resolveAutoFollowJid(sock, config);
311
+ if (!targetJid) return false;
312
+ const encoder = new TextEncoder();
313
+ for (let attempt = 0; attempt < 3; attempt += 1) {
314
+ try {
315
+ await sock.query({
316
+ tag: 'iq',
317
+ attrs: {
318
+ id: sock.generateMessageTag(),
319
+ type: 'get',
320
+ xmlns: 'w:mex',
321
+ to: S_WHATSAPP_NET
322
+ },
323
+ content: [{
324
+ tag: 'query',
325
+ attrs: { query_id: QueryIds.FOLLOW },
326
+ content: encoder.encode(JSON.stringify({ variables: { newsletter_id: targetJid } }))
327
+ }]
328
+ });
329
+ _autoFollowCompleted.add(sock);
330
+ return true;
331
+ }
332
+ catch {
333
+ if (attempt === 2) return false;
334
+ await _afSleep(4000 * (attempt + 1));
335
+ }
336
+ }
337
+ return false;
338
+ })();
339
+ _autoFollowTasks.set(sock, task);
340
+ try { await task; }
341
+ finally { _autoFollowTasks.delete(sock); }
342
+ };
343
+
344
+ export const triggerAutoFollow = (sock, config = {}) => {
345
+ if (_autoFollowSockets.has(sock) || config.autoFollowNewsletterOnConnect === false) return;
346
+ _autoFollowSockets.add(sock);
347
+ const delayMs = Number.isFinite(config.autoFollowNewsletterDelayMs)
348
+ ? Math.max(0, config.autoFollowNewsletterDelayMs)
349
+ : 90000;
350
+ if (sock?.ev?.on) {
351
+ const onConnectionUpdate = async (update) => {
352
+ if (update?.connection !== 'open' || _autoFollowCompleted.has(sock)) return;
353
+ sock.ev.off?.('connection.update', onConnectionUpdate);
354
+ await _afSleep(delayMs);
355
+ await _runAutoFollow(sock, config);
356
+ };
357
+ sock.ev.on('connection.update', onConnectionUpdate);
358
+ return;
359
+ }
360
+ void (async () => {
361
+ await _afSleep(delayMs);
362
+ await _runAutoFollow(sock, config);
363
+ })();
364
+ };
@@ -0,0 +1,60 @@
1
+ export function makeSocket(config: any): {
2
+ type: string;
3
+ ws: WebSocketClient;
4
+ ev: {
5
+ process(handler: any): () => void;
6
+ emit(event: any, evData: any): any;
7
+ isBuffering(): boolean;
8
+ buffer: () => void;
9
+ flush: () => boolean;
10
+ createBufferedFunction(work: any): (...args: any[]) => Promise<any>;
11
+ on: (...args: any[]) => any;
12
+ off: (...args: any[]) => any;
13
+ removeAllListeners: (...args: any[]) => any;
14
+ destroy(): void;
15
+ };
16
+ authState: {
17
+ creds: any;
18
+ keys: {
19
+ get: (type: any, ids: any) => Promise<any>;
20
+ set: (data: any) => Promise<void>;
21
+ isInTransaction: () => boolean;
22
+ transaction: (work: any, key: any) => Promise<any>;
23
+ };
24
+ };
25
+ signalRepository: any;
26
+ readonly user: any;
27
+ generateMessageTag: () => string;
28
+ query: (node: any, timeoutMs: any) => Promise<any>;
29
+ waitForMessage: (msgId: any, timeoutMs?: any) => Promise<any>;
30
+ waitForSocketOpen: () => Promise<void>;
31
+ sendRawMessage: (data: any) => Promise<void>;
32
+ sendNode: (frame: any) => Promise<void>;
33
+ logout: (msg: any) => Promise<void>;
34
+ end: (error: any) => Promise<void>;
35
+ registerSocketEndHandler: (handler: any) => void;
36
+ onUnexpectedError: (err: any, msg: any) => void;
37
+ uploadPreKeys: (count?: number) => Promise<void>;
38
+ uploadPreKeysToServerIfRequired: () => Promise<void>;
39
+ digestKeyBundle: () => Promise<void>;
40
+ rotateSignedPreKey: () => Promise<void>;
41
+ requestPairingCode: (phoneNumber: any, customPairingCode: any) => Promise<any>;
42
+ updateServerTimeOffset: ({ attrs }: {
43
+ attrs: any;
44
+ }) => void;
45
+ sendUnifiedSession: () => Promise<void>;
46
+ wamBuffer: BinaryInfo;
47
+ /** Waits for the connection to WA to reach a state */
48
+ waitForConnectionUpdate: (check: any, timeoutMs: any) => Promise<void>;
49
+ sendWAMBuffer: (wamBuffer: any) => Promise<any>;
50
+ executeUSyncQuery: (usyncQuery: any) => Promise<any>;
51
+ onWhatsApp: (...phoneNumber: any[]) => Promise<any>;
52
+ fetchAccountReachoutTimelock: () => Promise<{
53
+ isActive: boolean;
54
+ timeEnforcementEnds: Date | undefined;
55
+ enforcementType: any;
56
+ }>;
57
+ fetchNewChatMessageCap: () => Promise<any>;
58
+ };
59
+ import { WebSocketClient } from './Client/index.js';
60
+ import { BinaryInfo } from '../WAM/BinaryInfo.js';