@badzz88/baileys 8.4.6 → 8.4.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 (250) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1055 -337
  3. package/WAProto/WAProto.proto +850 -32
  4. package/WAProto/index.d.ts +4913 -25
  5. package/WAProto/index.js +14074 -98
  6. package/package.json +96 -131
  7. package/src/Defaults/index.js +201 -0
  8. package/src/Defaults/phonenumber-mcc.json +223 -0
  9. package/src/Signal/Group/ciphertext-message.js +15 -0
  10. package/src/Signal/Group/group-session-builder.js +92 -0
  11. package/src/Signal/Group/group_cipher.js +89 -0
  12. package/src/Signal/Group/index.js +136 -0
  13. package/src/Signal/Group/keyhelper.js +73 -0
  14. package/src/Signal/Group/sender-chain-key.js +32 -0
  15. package/src/Signal/Group/sender-key-distribution-message.js +66 -0
  16. package/src/Signal/Group/sender-key-message.js +69 -0
  17. package/src/Signal/Group/sender-key-name.js +50 -0
  18. package/src/Signal/Group/sender-key-record.js +44 -0
  19. package/src/Signal/Group/sender-key-state.js +97 -0
  20. package/src/Signal/Group/sender-message-key.js +30 -0
  21. package/src/Signal/libsignal.js +470 -0
  22. package/src/Signal/lid-mapping.js +262 -0
  23. package/src/Socket/Client/index.js +30 -0
  24. package/src/Socket/Client/types.js +13 -0
  25. package/src/Socket/Client/websocket.js +62 -0
  26. package/src/Socket/aigroups.js +240 -0
  27. package/src/Socket/business.js +422 -0
  28. package/src/Socket/chats.js +2374 -0
  29. package/src/Socket/communities.js +580 -0
  30. package/src/Socket/graphql.js +915 -0
  31. package/src/Socket/groups.js +812 -0
  32. package/src/Socket/index.js +37 -0
  33. package/src/Socket/interactive-handler.js +579 -0
  34. package/src/Socket/interop.js +566 -0
  35. package/src/Socket/managed-account.js +214 -0
  36. package/src/Socket/messages-recv.js +3012 -0
  37. package/src/Socket/messages-send.js +2163 -0
  38. package/{lib → src}/Socket/mex.js +11 -5
  39. package/src/Socket/newsletter.js +1057 -0
  40. package/src/Socket/privacy.js +452 -0
  41. package/src/Socket/registration.js +434 -0
  42. package/src/Socket/socket.js +1079 -0
  43. package/src/Socket/text-router.js +67 -0
  44. package/src/Socket/username.js +234 -0
  45. package/src/Store/index.js +36 -0
  46. package/src/Store/make-cache-manager-store.js +90 -0
  47. package/src/Store/make-in-memory-store.js +506 -0
  48. package/src/Store/make-ordered-dictionary.js +81 -0
  49. package/src/Store/object-repository.js +29 -0
  50. package/src/Types/Auth.js +38 -0
  51. package/src/Types/Bussines.js +2 -0
  52. package/src/Types/Call.js +2 -0
  53. package/src/Types/Chat.js +4 -0
  54. package/src/Types/Contact.js +2 -0
  55. package/src/Types/Events.js +2 -0
  56. package/src/Types/GroupMetadata.js +2 -0
  57. package/src/Types/Label.js +27 -0
  58. package/src/Types/LabelAssociation.js +9 -0
  59. package/src/Types/Message.js +95 -0
  60. package/src/Types/Newsletter.js +152 -0
  61. package/src/Types/Product.js +2 -0
  62. package/src/Types/Signal.js +2 -0
  63. package/src/Types/Socket.js +2 -0
  64. package/src/Types/State.js +70 -0
  65. package/src/Types/USync.js +2 -0
  66. package/src/Types/index.js +54 -0
  67. package/src/Utils/auth-utils.js +306 -0
  68. package/src/Utils/browser-utils.js +114 -0
  69. package/src/Utils/business.js +247 -0
  70. package/src/Utils/chat-utils.js +1272 -0
  71. package/src/Utils/consumer-application.js +107 -0
  72. package/src/Utils/crypto.js +125 -0
  73. package/src/Utils/decode-wa-message.js +808 -0
  74. package/src/Utils/event-buffer.js +586 -0
  75. package/src/Utils/generics.js +640 -0
  76. package/src/Utils/group-history.js +60 -0
  77. package/src/Utils/history.js +244 -0
  78. package/src/Utils/identity-change-handler.js +52 -0
  79. package/src/Utils/index.js +53 -0
  80. package/src/Utils/jid-display-normalization.js +218 -0
  81. package/src/Utils/link-preview.js +143 -0
  82. package/src/Utils/logger.js +9 -0
  83. package/src/Utils/lt-hash.js +10 -0
  84. package/src/Utils/make-mutex.js +36 -0
  85. package/src/Utils/message-composer.js +479 -0
  86. package/src/Utils/message-inspect.js +400 -0
  87. package/src/Utils/message-retry-manager.js +231 -0
  88. package/src/Utils/messages-media.js +943 -0
  89. package/src/Utils/messages.js +2490 -0
  90. package/src/Utils/meta-ai-msmsg.js +133 -0
  91. package/src/Utils/noise-handler.js +194 -0
  92. package/src/Utils/offline-node-processor.js +42 -0
  93. package/src/Utils/pre-key-manager.js +107 -0
  94. package/src/Utils/process-message.js +1047 -0
  95. package/src/Utils/reporting-utils.js +262 -0
  96. package/src/Utils/signal.js +192 -0
  97. package/src/Utils/stanza-ack.js +74 -0
  98. package/src/Utils/sync-action-utils.js +54 -0
  99. package/src/Utils/tc-token-utils.js +161 -0
  100. package/src/Utils/use-multi-file-auth-state.js +121 -0
  101. package/src/Utils/validate-connection.js +248 -0
  102. package/src/Utils/voip-rekey.js +22 -0
  103. package/src/WABinary/constants.js +1304 -0
  104. package/src/WABinary/decode.js +377 -0
  105. package/src/WABinary/encode.js +58 -0
  106. package/src/WABinary/generic-utils.js +148 -0
  107. package/src/WABinary/index.js +33 -0
  108. package/src/WABinary/jid-utils.js +374 -0
  109. package/src/WABinary/types.js +2 -0
  110. package/src/WAM/BinaryInfo.js +13 -0
  111. package/src/WAM/constants.js +39486 -0
  112. package/src/WAM/encode.js +142 -0
  113. package/src/WAM/index.js +31 -0
  114. package/src/WAUSync/Protocols/USyncBotProfileProtocol.js +55 -0
  115. package/src/WAUSync/Protocols/USyncBusinessProtocol.js +100 -0
  116. package/src/WAUSync/Protocols/USyncContactProtocol.js +60 -0
  117. package/src/WAUSync/Protocols/USyncDeviceProtocol.js +65 -0
  118. package/src/WAUSync/Protocols/USyncDisappearingModeProtocol.js +27 -0
  119. package/src/WAUSync/Protocols/USyncFeatureProtocol.js +74 -0
  120. package/src/WAUSync/Protocols/USyncLIDProtocol.js +31 -0
  121. package/src/WAUSync/Protocols/USyncPictureProtocol.js +32 -0
  122. package/src/WAUSync/Protocols/USyncSidelistProtocol.js +29 -0
  123. package/src/WAUSync/Protocols/USyncStatusProtocol.js +44 -0
  124. package/src/WAUSync/Protocols/USyncTextStatusProtocol.js +38 -0
  125. package/src/WAUSync/Protocols/USyncUsernameProtocol.js +28 -0
  126. package/src/WAUSync/Protocols/index.js +40 -0
  127. package/src/WAUSync/USyncBackoff.js +31 -0
  128. package/src/WAUSync/USyncQuery.js +204 -0
  129. package/src/WAUSync/USyncUser.js +58 -0
  130. package/src/WAUSync/index.js +32 -0
  131. package/src/antiban.js +4726 -0
  132. package/{lib → src}/index.js +48 -16
  133. package/lib/Defaults/baileys-version.json +0 -3
  134. package/lib/Defaults/index.js +0 -137
  135. package/lib/Defaults/phonenumber-mcc.json +0 -223
  136. package/lib/Signal/Group/Protocols.js +0 -269
  137. package/lib/Signal/Group/ciphertext-message.js +0 -12
  138. package/lib/Signal/Group/group-session-builder.js +0 -30
  139. package/lib/Signal/Group/group_cipher.js +0 -82
  140. package/lib/Signal/Group/index.js +0 -12
  141. package/lib/Signal/Group/keyhelper.js +0 -18
  142. package/lib/Signal/Group/queue-job.js +0 -57
  143. package/lib/Signal/Group/sender-chain-key.js +0 -26
  144. package/lib/Signal/Group/sender-key-distribution-message.js +0 -63
  145. package/lib/Signal/Group/sender-key-message.js +0 -66
  146. package/lib/Signal/Group/sender-key-name.js +0 -48
  147. package/lib/Signal/Group/sender-key-record.js +0 -41
  148. package/lib/Signal/Group/sender-key-state.js +0 -84
  149. package/lib/Signal/Group/sender-message-key.js +0 -26
  150. package/lib/Signal/libsignal.js +0 -432
  151. package/lib/Signal/lid-mapping.js +0 -277
  152. package/lib/Socket/Client/abstract-socket-client.js +0 -13
  153. package/lib/Socket/Client/index.js +0 -3
  154. package/lib/Socket/Client/mobile-socket-client.js +0 -65
  155. package/lib/Socket/Client/types.js +0 -11
  156. package/lib/Socket/Client/web-socket-client.js +0 -62
  157. package/lib/Socket/Client/websocket.js +0 -54
  158. package/lib/Socket/business.js +0 -379
  159. package/lib/Socket/chats.js +0 -1193
  160. package/lib/Socket/communities.js +0 -431
  161. package/lib/Socket/community.js +0 -392
  162. package/lib/Socket/dugong.js +0 -637
  163. package/lib/Socket/groups.js +0 -374
  164. package/lib/Socket/index.js +0 -12
  165. package/lib/Socket/luxu.js +0 -387
  166. package/lib/Socket/messages-recv.js +0 -1916
  167. package/lib/Socket/messages-send.js +0 -1459
  168. package/lib/Socket/newsletter.js +0 -253
  169. package/lib/Socket/registration.js +0 -167
  170. package/lib/Socket/socket.js +0 -950
  171. package/lib/Socket/username.js +0 -146
  172. package/lib/Socket/usync.js +0 -69
  173. package/lib/Store/index.js +0 -10
  174. package/lib/Store/keyed-db.js +0 -108
  175. package/lib/Store/make-cache-manager-store.js +0 -85
  176. package/lib/Store/make-in-memory-store.js +0 -198
  177. package/lib/Store/make-ordered-dictionary.js +0 -75
  178. package/lib/Store/object-repository.js +0 -32
  179. package/lib/Types/Auth.js +0 -2
  180. package/lib/Types/Bussines.js +0 -2
  181. package/lib/Types/Call.js +0 -2
  182. package/lib/Types/Chat.js +0 -8
  183. package/lib/Types/Contact.js +0 -2
  184. package/lib/Types/Events.js +0 -2
  185. package/lib/Types/GroupMetadata.js +0 -2
  186. package/lib/Types/Label.js +0 -25
  187. package/lib/Types/LabelAssociation.js +0 -7
  188. package/lib/Types/Message.js +0 -11
  189. package/lib/Types/Mex.js +0 -37
  190. package/lib/Types/Newsletter.js +0 -38
  191. package/lib/Types/Product.js +0 -2
  192. package/lib/Types/Signal.js +0 -2
  193. package/lib/Types/Socket.js +0 -3
  194. package/lib/Types/State.js +0 -56
  195. package/lib/Types/USync.js +0 -2
  196. package/lib/Types/index.js +0 -26
  197. package/lib/Utils/auth-utils.js +0 -302
  198. package/lib/Utils/baileys-event-stream.js +0 -63
  199. package/lib/Utils/browser-utils.js +0 -48
  200. package/lib/Utils/business.js +0 -231
  201. package/lib/Utils/chat-utils.js +0 -873
  202. package/lib/Utils/companion-reg-client-utils.js +0 -35
  203. package/lib/Utils/crypto.js +0 -118
  204. package/lib/Utils/decode-wa-message.js +0 -350
  205. package/lib/Utils/event-buffer.js +0 -622
  206. package/lib/Utils/generics.js +0 -399
  207. package/lib/Utils/history.js +0 -134
  208. package/lib/Utils/identity-change-handler.js +0 -50
  209. package/lib/Utils/index.js +0 -23
  210. package/lib/Utils/link-preview.js +0 -85
  211. package/lib/Utils/logger.js +0 -3
  212. package/lib/Utils/lt-hash.js +0 -8
  213. package/lib/Utils/make-mutex.js +0 -33
  214. package/lib/Utils/message-composer.js +0 -273
  215. package/lib/Utils/message-retry-manager.js +0 -265
  216. package/lib/Utils/messages-media.js +0 -788
  217. package/lib/Utils/messages.js +0 -1260
  218. package/lib/Utils/noise-handler.js +0 -201
  219. package/lib/Utils/offline-node-processor.js +0 -40
  220. package/lib/Utils/pre-key-manager.js +0 -106
  221. package/lib/Utils/process-message.js +0 -630
  222. package/lib/Utils/reporting-utils.js +0 -258
  223. package/lib/Utils/signal.js +0 -202
  224. package/lib/Utils/stanza-ack.js +0 -38
  225. package/lib/Utils/sync-action-utils.js +0 -49
  226. package/lib/Utils/tc-token-utils.js +0 -163
  227. package/lib/Utils/use-multi-file-auth-state.js +0 -121
  228. package/lib/Utils/validate-connection.js +0 -204
  229. package/lib/WABinary/constants.js +0 -1301
  230. package/lib/WABinary/decode.js +0 -262
  231. package/lib/WABinary/encode.js +0 -220
  232. package/lib/WABinary/generic-utils.js +0 -204
  233. package/lib/WABinary/index.js +0 -6
  234. package/lib/WABinary/jid-utils.js +0 -98
  235. package/lib/WABinary/types.js +0 -2
  236. package/lib/WAM/BinaryInfo.js +0 -10
  237. package/lib/WAM/constants.js +0 -22853
  238. package/lib/WAM/encode.js +0 -150
  239. package/lib/WAM/index.js +0 -4
  240. package/lib/WAUSync/Protocols/USyncContactProtocol.js +0 -52
  241. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +0 -54
  242. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +0 -27
  243. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +0 -38
  244. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +0 -25
  245. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +0 -51
  246. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +0 -29
  247. package/lib/WAUSync/Protocols/index.js +0 -6
  248. package/lib/WAUSync/USyncQuery.js +0 -98
  249. package/lib/WAUSync/USyncUser.js +0 -31
  250. package/lib/WAUSync/index.js +0 -4
@@ -0,0 +1,452 @@
1
+ 'use strict'
2
+ Object.defineProperty(exports, '__esModule', { value: true })
3
+ exports.makePrivacySocket = void 0
4
+
5
+ const { executeWMexQuery } = require('./mex')
6
+
7
+ /**
8
+ * MEX query IDs for privacy, status/profile, account/auth, and misc operations.
9
+ * Source: assets/whatsapp-android-mex_client_persist_ids.json
10
+ */
11
+ const PRIVACY_MEX_IDS = {
12
+ // Privacy settings
13
+ GET_SETTINGS: '32774292262215379', // GetPrivacySettingsQuery
14
+ SET_SETTING: '26887749497493182', // SetPrivacySettingMutation
15
+ UPDATE_CONTACT_LIST: '26375158178762799', // UpdatePrivacyContactListMutation
16
+ GET_CONTACT_LIST: '25700444246275822', // GetPrivacyContactListQuery
17
+ // Status / profile
18
+ UPDATE_TEXT_STATUS: '25863197129975892', // UpdateTextStatus
19
+ GET_TEXT_STATUS_LIST: '25741205615468935', // GetTextStatusList
20
+ UPDATE_USER_STATUS: '7452341274886724', // UpdateUserStatus
21
+ FETCH_USER_PICTURE: '24983561624604407', // FetchUserPictureInfo
22
+ PROFILE_PICTURE_MUTATION: '24714239711610700', // ProfilePictureMutation
23
+ // Account / auth
24
+ ACCOUNT_LOGIN: '27298465499757127', // AccountLoginMutation
25
+ ACCOUNT_LOGOUT: '26863447609979194', // AccountLogoutMutation
26
+ MULTI_ACCOUNT_REVOKE: '25846242091639661', // MultiAccountRevokeAccount
27
+ ADD_MULTI_ACCOUNT_LINK: '25502812266025193', // AddMultiAccountLink
28
+ ADD_TRUSTED_DEVICE: '24522952587403287', // AddTrustedDeviceMutation
29
+ GET_TRUSTED_DEVICES: '27391232653862770', // GetTrustedDevicesQuery
30
+ UNTRUST_TRUSTED_DEVICE: '26574930682133620', // UntrustTrustedDeviceMutation
31
+ DELETE_TRUSTED_DEVICE: '33867503889559538', // DeleteTrustedDeviceMutation
32
+ // Misc
33
+ MOBILE_CONFIG_FETCH: '25676911271914597', // MobileConfigFetchQuery
34
+ NOTIFY_PUSH_NAME: '25900490552974543', // NotifyPushName
35
+ CONTACT_INTEGRITY: '25924358997169495', // ContactIntegrityQuery
36
+ BIZ_INTEGRITY: '25975613018777537', // BizIntegrityQuery
37
+ LINKED_PROFILES_SET: '25013968611531010', // LinkedProfilesSet
38
+ LINKED_PROFILES_REMOVE: '24537675509265525', // LinkedProfilesRemove
39
+ LINKED_PROFILES_UPDATE: '24876967165297614', // LinkedProfilesUpdate
40
+ MIGRATE_BLOCKLIST_LID: '25028600226770432', // MigrateBlocklistLid
41
+ QR_CODE_SCAN: '26287165600869744' // QRCodeScan
42
+ }
43
+
44
+ const makePrivacySocket = sock => {
45
+ const { query, generateMessageTag } = sock
46
+
47
+ const mexQuery = (variables, queryId, dataPath) =>
48
+ executeWMexQuery(variables, queryId, dataPath, query, generateMessageTag)
49
+
50
+ // ── Privacy Settings ────────────────────────────────────────────────────
51
+
52
+ /**
53
+ * Fetch all privacy settings via MEX.
54
+ * Confirmed from C24395AkT.java — variables: { users: [{ jid, privacy_features: [...] }] }
55
+ * dataPath: xwa2_fetch_wa_users (array of users, each with privacy_settings[])
56
+ *
57
+ * @param {string} jid - Own JID
58
+ * @param {string[]} [features] - Privacy features to fetch (default: all known)
59
+ */
60
+ const getPrivacySettings = (jid, features = null) => {
61
+ const users = [{ jid, ...(features ? { privacy_features: features } : {}) }]
62
+ return mexQuery({ users }, PRIVACY_MEX_IDS.GET_SETTINGS, 'xwa2_fetch_wa_users')
63
+ }
64
+
65
+ /**
66
+ * Set a privacy setting via MEX.
67
+ * Confirmed from C24403Akb.java — variables: { feature, setting }
68
+ * dataPath: xwa2_privacy_feature_update
69
+ *
70
+ * Values are lowercase and case-sensitive on the wire (confirmed 2026-07-19 against
71
+ * WASmaxInPrivacyEnums / WAWebPrivacySettings) — NOT the uppercase values this doc used to list.
72
+ *
73
+ * Known features: "last" (last seen), "online", "profile" (photo), "status", "readreceipts",
74
+ * "groupadd" (who can add you to groups), "groupcreation", "calladd",
75
+ * "defense" (anti-scraping), "messages", "linked_profiles", "cover_photo",
76
+ * "dependentaccountmessages", "pix", "stickers"
77
+ * (the last 6 are business-account-only)
78
+ * Known settings: "all", "contacts", "contact_blacklist", "none" — most features.
79
+ * "online" only accepts "all" | "match_last_seen".
80
+ * "calladd" only accepts "all" | "contacts" | "known".
81
+ * "defense" only accepts "off" | "on_standard".
82
+ *
83
+ * @param {string} feature - Privacy feature name
84
+ * @param {string} setting - New value
85
+ */
86
+ const setPrivacySetting = (feature, setting) =>
87
+ mexQuery({ feature, setting }, PRIVACY_MEX_IDS.SET_SETTING, 'xwa2_privacy_feature_update')
88
+
89
+ /**
90
+ * Update the contact list for a privacy setting (e.g. "GROUPS" with CONTACT_BLACKLIST).
91
+ * Confirmed from InteropPrivacySettingWithContactListUpdate pattern.
92
+ * dataPath: xwa2_privacy_contact_list_update
93
+ *
94
+ * @param {string} feature - Privacy feature
95
+ * @param {string} setting - "CONTACT_BLACKLIST" | "CONTACTS"
96
+ * @param {string[]} jids - List of JIDs to include in the list
97
+ */
98
+ const updatePrivacyContactList = (feature, setting, jids) =>
99
+ mexQuery(
100
+ { feature, setting, contacts: jids.map(jid => ({ jid })) },
101
+ PRIVACY_MEX_IDS.UPDATE_CONTACT_LIST,
102
+ 'xwa2_privacy_contact_list_update'
103
+ )
104
+
105
+ /**
106
+ * Fetch the contact list for a privacy setting.
107
+ * dataPath: xwa2_privacy_contact_list
108
+ *
109
+ * @param {string} feature - Privacy feature
110
+ * @param {string} setting - "CONTACT_BLACKLIST" | "CONTACTS"
111
+ */
112
+ const getPrivacyContactList = (feature, setting) =>
113
+ mexQuery({ feature, setting }, PRIVACY_MEX_IDS.GET_CONTACT_LIST, 'xwa2_privacy_contact_list')
114
+
115
+ // ── Status / Profile ───────────────────────────────────────────────────
116
+
117
+ /**
118
+ * Update own text status (About/Evolved About) via MEX.
119
+ * Confirmed from C227219wi.java:
120
+ * text_status_input: { text, emoji: { content } }
121
+ * dataPath: xwa2_text_status_update
122
+ *
123
+ * @param {string} text - Status text
124
+ * @param {string} [emoji] - Optional emoji to attach
125
+ */
126
+ const updateTextStatus = (text, emoji = null) => {
127
+ const input = { text }
128
+ if (emoji) input.emoji = { content: emoji }
129
+ return mexQuery({ text_status_input: input }, PRIVACY_MEX_IDS.UPDATE_TEXT_STATUS, 'xwa2_text_status_update')
130
+ }
131
+
132
+ /**
133
+ * Fetch text statuses (About) for a list of JIDs via MEX.
134
+ * Confirmed from C227219wi.java:
135
+ * input: [{ jid, last_update_time: null }]
136
+ * dataPath: xwa2_text_status_list
137
+ *
138
+ * @param {string[]} jids - JIDs to fetch statuses for
139
+ * @param {number|null} [lastUpdateTime] - Only return statuses newer than this timestamp
140
+ */
141
+ const getTextStatusList = (jids, lastUpdateTime = null) => {
142
+ const input = jids.map(jid => ({ jid, last_update_time: lastUpdateTime }))
143
+ return mexQuery({ input }, PRIVACY_MEX_IDS.GET_TEXT_STATUS_LIST, 'xwa2_text_status_list')
144
+ }
145
+
146
+ /**
147
+ * Update own user status string via MEX.
148
+ * Confirmed from UpdateUserStatus mutation — variables: { status }
149
+ * dataPath: xwa2_update_user_status
150
+ *
151
+ * @param {string} status - New status string
152
+ */
153
+ const updateUserStatus = status => mexQuery({ status }, PRIVACY_MEX_IDS.UPDATE_USER_STATUS, 'xwa2_update_user_status')
154
+
155
+ /**
156
+ * Fetch picture info for a user via MEX.
157
+ * dataPath: xwa2_fetch_user_picture_info
158
+ *
159
+ * @param {string} jid - JID to fetch picture info for
160
+ */
161
+ const fetchUserPictureInfo = jid =>
162
+ mexQuery({ jid }, PRIVACY_MEX_IDS.FETCH_USER_PICTURE, 'xwa2_fetch_user_picture_info')
163
+
164
+ /**
165
+ * Set own profile picture via MEX.
166
+ * dataPath: xwa2_profile_picture_mutation
167
+ *
168
+ * @param {string} imageBase64 - Base64-encoded image data
169
+ * @param {'image'|'preview'} [type='image'] - Picture type
170
+ */
171
+ const setProfilePictureMex = (imageBase64, type = 'image') =>
172
+ mexQuery(
173
+ { input: { image: imageBase64, type } },
174
+ PRIVACY_MEX_IDS.PROFILE_PICTURE_MUTATION,
175
+ 'xwa2_profile_picture_mutation'
176
+ )
177
+
178
+ // ── Account / Auth ─────────────────────────────────────────────────────
179
+
180
+ /**
181
+ * Mark account as logged-in via MEX (companion device registration flow).
182
+ * Confirmed from LogoutManager.java:
183
+ * input: { phone_number }
184
+ * dataPath: xwa2_account_login
185
+ *
186
+ * @param {string} phoneNumber - Phone number (raw, e.g. "491234567890")
187
+ */
188
+ const accountLogin = phoneNumber =>
189
+ mexQuery({ input: { phone_number: phoneNumber } }, PRIVACY_MEX_IDS.ACCOUNT_LOGIN, 'xwa2_account_login')
190
+
191
+ /**
192
+ * Mark account as logged-out via MEX.
193
+ * Confirmed from LogoutManager.java:
194
+ * input: { phone_number, enabled_biometric }
195
+ * dataPath: xwa2_account_logout
196
+ *
197
+ * @param {string} phoneNumber - Phone number
198
+ * @param {boolean} [enabledBiometric=false]
199
+ */
200
+ const accountLogout = (phoneNumber, enabledBiometric = false) =>
201
+ mexQuery(
202
+ { input: { phone_number: phoneNumber, enabled_biometric: enabledBiometric } },
203
+ PRIVACY_MEX_IDS.ACCOUNT_LOGOUT,
204
+ 'xwa2_account_logout'
205
+ )
206
+
207
+ /**
208
+ * Add a multi-account link (secondary account) via MEX.
209
+ * Confirmed from AddMultiAccountLink mutation:
210
+ * input: { phone_number }
211
+ * dataPath: xwa2_add_multi_account_link
212
+ *
213
+ * @param {string} phoneNumber - Phone number of account to link
214
+ */
215
+ const addMultiAccountLink = phoneNumber =>
216
+ mexQuery(
217
+ { input: { phone_number: phoneNumber } },
218
+ PRIVACY_MEX_IDS.ADD_MULTI_ACCOUNT_LINK,
219
+ 'xwa2_add_multi_account_link'
220
+ )
221
+
222
+ /**
223
+ * Add a trusted device (biometric/passkey) via MEX.
224
+ * Confirmed from RegTrustedDeviceGraphQLHelper.java:
225
+ * device_id, device_name
226
+ * dataPath: xwa2_add_trusted_device
227
+ *
228
+ * @param {string} deviceId - Device ID suffix
229
+ * @param {string} deviceName - Human-readable device name
230
+ */
231
+ const addTrustedDevice = (deviceId, deviceName) =>
232
+ mexQuery(
233
+ { device_id: deviceId, device_name: deviceName },
234
+ PRIVACY_MEX_IDS.ADD_TRUSTED_DEVICE,
235
+ 'xwa2_add_trusted_device'
236
+ )
237
+
238
+ /**
239
+ * Fetch list of trusted devices for the account via MEX.
240
+ * dataPath: xwa2_get_trusted_devices
241
+ */
242
+ const getTrustedDevices = () => mexQuery({}, PRIVACY_MEX_IDS.GET_TRUSTED_DEVICES, 'xwa2_get_trusted_devices')
243
+
244
+ /**
245
+ * Untrust (remove) a trusted device via MEX.
246
+ * Confirmed from RegTrustedDeviceGraphQLHelper.java:
247
+ * device_id, reason (default: "REREG")
248
+ * dataPath: xwa2_untrust_trusted_device
249
+ *
250
+ * @param {string} deviceId - Device ID to remove
251
+ * @param {string} [reason='USER_INITIATED']
252
+ */
253
+ const untrustTrustedDevice = (deviceId, reason = 'USER_INITIATED') =>
254
+ mexQuery({ device_id: deviceId, reason }, PRIVACY_MEX_IDS.UNTRUST_TRUSTED_DEVICE, 'xwa2_untrust_trusted_device')
255
+
256
+ /**
257
+ * Delete a trusted device entirely via MEX.
258
+ * dataPath: xwa2_delete_trusted_device
259
+ *
260
+ * @param {string} deviceId - Device ID to delete
261
+ */
262
+ const deleteTrustedDevice = deviceId =>
263
+ mexQuery({ device_id: deviceId }, PRIVACY_MEX_IDS.DELETE_TRUSTED_DEVICE, 'xwa2_delete_trusted_device')
264
+
265
+ /**
266
+ * Revoke multi-account link for a secondary account via MEX.
267
+ * dataPath: xwa2_multi_account_revoke
268
+ *
269
+ * @param {string} accountJid - JID of the account to revoke
270
+ */
271
+ const revokeMultiAccount = accountJid =>
272
+ mexQuery({ account_jid: accountJid }, PRIVACY_MEX_IDS.MULTI_ACCOUNT_REVOKE, 'xwa2_multi_account_revoke')
273
+
274
+ // ── Misc ───────────────────────────────────────────────────────────────
275
+
276
+ /**
277
+ * Fetch mobile config via MEX.
278
+ * Confirmed from C28889Clt.java:
279
+ * api_version, ep_refresh_id, flags
280
+ * dataPath: xwa2_mobile_config_fetch
281
+ *
282
+ * @param {number} [apiVersion=0]
283
+ * @param {number} [epRefreshId=0]
284
+ * @param {string} [flags='']
285
+ */
286
+ const fetchMobileConfig = (apiVersion = 0, epRefreshId = 0, flags = '') =>
287
+ mexQuery(
288
+ { api_version: apiVersion, ep_refresh_id: epRefreshId, flags },
289
+ PRIVACY_MEX_IDS.MOBILE_CONFIG_FETCH,
290
+ 'xwa2_mobile_config_fetch'
291
+ )
292
+
293
+ /**
294
+ * Notify group members of your push name via MEX.
295
+ * Confirmed from C128275fj.java:
296
+ * input: { group_jid, participants: [{ jid, push_name }] }
297
+ * dataPath: xwa2_notify_push_name
298
+ *
299
+ * @param {string} groupJid - Group JID
300
+ * @param {{ jid: string, pushName: string }[]} participants
301
+ */
302
+ const notifyPushName = (groupJid, participants) =>
303
+ mexQuery(
304
+ {
305
+ input: {
306
+ group_jid: groupJid,
307
+ participants: participants.map(({ jid, pushName }) => ({ jid, push_name: pushName }))
308
+ }
309
+ },
310
+ PRIVACY_MEX_IDS.NOTIFY_PUSH_NAME,
311
+ 'xwa2_notify_push_name'
312
+ )
313
+
314
+ /**
315
+ * Run a contact integrity check via MEX.
316
+ * Confirmed from RunnableC24106Aep.java — uses xwa2_fetch_wa_users path.
317
+ * use_case: "START_CHAT_CONTEXT"
318
+ *
319
+ * @param {string[]} jids - JIDs to check
320
+ * @param {string} [useCase='START_CHAT_CONTEXT']
321
+ */
322
+ const contactIntegrityQuery = (jids, useCase = 'START_CHAT_CONTEXT') =>
323
+ mexQuery(
324
+ { users: jids.map(jid => ({ jid })), use_case: useCase },
325
+ PRIVACY_MEX_IDS.CONTACT_INTEGRITY,
326
+ 'xwa2_fetch_wa_users'
327
+ )
328
+
329
+ /**
330
+ * Run a business integrity check via MEX.
331
+ * Confirmed from BizIntegrityQuery — variables: { users: [{ jid }] }
332
+ * dataPath: xwa2_fetch_wa_users
333
+ *
334
+ * @param {string[]} jids - Business JIDs to check
335
+ */
336
+ const bizIntegrityQuery = jids =>
337
+ mexQuery({ users: jids.map(jid => ({ jid })) }, PRIVACY_MEX_IDS.BIZ_INTEGRITY, 'xwa2_fetch_wa_users')
338
+
339
+ /**
340
+ * Set linked social profiles (FB/IG) via MEX.
341
+ * Confirmed from C24386Ak3.java:
342
+ * profiles: [{ type: "FB"|"IG", username|vid, encrypted_metadata?, user_info? }]
343
+ * dataPath: xwa2_linked_profiles_set
344
+ *
345
+ * @param {{ type: 'FB'|'IG', username?: string, vid?: string }[]} profiles
346
+ */
347
+ const linkedProfilesSet = profiles => {
348
+ const mapped = profiles.map(p => {
349
+ const entry = { type: p.type }
350
+ if (p.vid) entry.vid = p.vid
351
+ else if (p.username) entry.username = p.username
352
+ return entry
353
+ })
354
+ return mexQuery({ profiles: mapped }, PRIVACY_MEX_IDS.LINKED_PROFILES_SET, 'xwa2_linked_profiles_set')
355
+ }
356
+
357
+ /**
358
+ * Remove linked social profiles via MEX.
359
+ * dataPath: xwa2_linked_profiles_remove
360
+ *
361
+ * @param {('FB'|'IG')[]} types - Profile types to remove
362
+ */
363
+ const linkedProfilesRemove = types =>
364
+ mexQuery(
365
+ { profiles: types.map(type => ({ type })) },
366
+ PRIVACY_MEX_IDS.LINKED_PROFILES_REMOVE,
367
+ 'xwa2_linked_profiles_remove'
368
+ )
369
+
370
+ /**
371
+ * Update linked social profile visibility/settings via MEX.
372
+ * Confirmed from LinkedProfilesUpdate mutation:
373
+ * profiles: [{ type, show_on_profile }]
374
+ * dataPath: xwa2_linked_profiles_update
375
+ *
376
+ * @param {{ type: 'FB'|'IG', showOnProfile: boolean }[]} profiles
377
+ */
378
+ const linkedProfilesUpdate = profiles =>
379
+ mexQuery(
380
+ { profiles: profiles.map(({ type, showOnProfile }) => ({ type, show_on_profile: showOnProfile })) },
381
+ PRIVACY_MEX_IDS.LINKED_PROFILES_UPDATE,
382
+ 'xwa2_linked_profiles_update'
383
+ )
384
+
385
+ /**
386
+ * Migrate blocklist to LID addressing via MEX.
387
+ * Confirmed from C8Eu.java:
388
+ * input: { blocklist: [{ jid }], dhash, dirty_ack }
389
+ * dataPath: xwa2_migrate_blocklist_lid
390
+ *
391
+ * @param {string[]} jids - Blocked JIDs to migrate
392
+ * @param {string} [dhash=''] - Current blocklist hash
393
+ * @param {boolean} [dirtyAck=true]
394
+ */
395
+ const migrateBlocklistLid = (jids, dhash = '', dirtyAck = true) =>
396
+ mexQuery(
397
+ {
398
+ input: {
399
+ blocklist: jids.map(jid => ({ jid })),
400
+ dhash,
401
+ dirty_ack: dirtyAck
402
+ }
403
+ },
404
+ PRIVACY_MEX_IDS.MIGRATE_BLOCKLIST_LID,
405
+ 'xwa2_migrate_blocklist_lid'
406
+ )
407
+
408
+ /**
409
+ * Scan a QR code via MEX (used for linking companion devices).
410
+ * dataPath: xwa2_qr_code_scan
411
+ *
412
+ * @param {string} qrData - Raw QR code data string
413
+ */
414
+ const qrCodeScan = qrData => mexQuery({ qr_data: qrData }, PRIVACY_MEX_IDS.QR_CODE_SCAN, 'xwa2_qr_code_scan')
415
+
416
+ return {
417
+ ...sock,
418
+ // Privacy
419
+ getPrivacySettings,
420
+ setPrivacySetting,
421
+ updatePrivacyContactList,
422
+ getPrivacyContactList,
423
+ // Status / profile
424
+ updateTextStatus,
425
+ getTextStatusList,
426
+ updateUserStatus,
427
+ fetchUserPictureInfo,
428
+ setProfilePictureMex,
429
+ // Account / auth
430
+ accountLogin,
431
+ accountLogout,
432
+ addMultiAccountLink,
433
+ addTrustedDevice,
434
+ getTrustedDevices,
435
+ untrustTrustedDevice,
436
+ deleteTrustedDevice,
437
+ revokeMultiAccount,
438
+ // Misc
439
+ fetchMobileConfig,
440
+ notifyPushName,
441
+ contactIntegrityQuery,
442
+ bizIntegrityQuery,
443
+ linkedProfilesSet,
444
+ linkedProfilesRemove,
445
+ linkedProfilesUpdate,
446
+ migrateBlocklistLid,
447
+ qrCodeScan,
448
+ PRIVACY_MEX_IDS
449
+ }
450
+ }
451
+
452
+ exports.makePrivacySocket = makePrivacySocket