@queenanya/baileys 9.2.1 → 9.4.1

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 (327) hide show
  1. package/README.md +349 -1171
  2. package/WAProto/fix-imports.js +74 -18
  3. package/WAProto/index.js +201 -160
  4. package/engine-requirements.js +7 -7
  5. package/lib/Defaults/index.d.ts +19 -0
  6. package/lib/Defaults/index.d.ts.map +1 -1
  7. package/lib/Defaults/index.js +32 -6
  8. package/lib/Defaults/index.js.map +1 -1
  9. package/lib/Signal/libsignal.d.ts.map +1 -1
  10. package/lib/Signal/libsignal.js +61 -2
  11. package/lib/Signal/libsignal.js.map +1 -1
  12. package/lib/Signal/lid-mapping.d.ts +5 -9
  13. package/lib/Signal/lid-mapping.d.ts.map +1 -1
  14. package/lib/Signal/lid-mapping.js +170 -70
  15. package/lib/Signal/lid-mapping.js.map +1 -1
  16. package/lib/Socket/Client/websocket.d.ts +1 -1
  17. package/lib/Socket/Client/websocket.d.ts.map +1 -1
  18. package/lib/Socket/Client/websocket.js +5 -1
  19. package/lib/Socket/Client/websocket.js.map +1 -1
  20. package/lib/Socket/business.d.ts +125 -5
  21. package/lib/Socket/business.d.ts.map +1 -1
  22. package/lib/Socket/business.js +11 -8
  23. package/lib/Socket/business.js.map +1 -1
  24. package/lib/Socket/chats.d.ts +22 -3
  25. package/lib/Socket/chats.d.ts.map +1 -1
  26. package/lib/Socket/chats.js +277 -58
  27. package/lib/Socket/chats.js.map +1 -1
  28. package/lib/Socket/communities.d.ts +125 -5
  29. package/lib/Socket/communities.d.ts.map +1 -1
  30. package/lib/Socket/groups.d.ts +19 -3
  31. package/lib/Socket/groups.d.ts.map +1 -1
  32. package/lib/Socket/groups.js +7 -1
  33. package/lib/Socket/groups.js.map +1 -1
  34. package/lib/Socket/index.d.ts +125 -5
  35. package/lib/Socket/index.d.ts.map +1 -1
  36. package/lib/Socket/index.js +0 -6
  37. package/lib/Socket/index.js.map +1 -1
  38. package/lib/Socket/messages-recv.d.ts +126 -6
  39. package/lib/Socket/messages-recv.d.ts.map +1 -1
  40. package/lib/Socket/messages-recv.js +771 -177
  41. package/lib/Socket/messages-recv.js.map +1 -1
  42. package/lib/Socket/messages-send.d.ts +129 -7
  43. package/lib/Socket/messages-send.d.ts.map +1 -1
  44. package/lib/Socket/messages-send.js +430 -119
  45. package/lib/Socket/messages-send.js.map +1 -1
  46. package/lib/Socket/newsletter.d.ts +20 -5
  47. package/lib/Socket/newsletter.d.ts.map +1 -1
  48. package/lib/Socket/newsletter.js +2 -47
  49. package/lib/Socket/newsletter.js.map +1 -1
  50. package/lib/Socket/socket.d.ts +3 -1
  51. package/lib/Socket/socket.d.ts.map +1 -1
  52. package/lib/Socket/socket.js +151 -29
  53. package/lib/Socket/socket.js.map +1 -1
  54. package/lib/Types/Auth.d.ts +2 -0
  55. package/lib/Types/Auth.d.ts.map +1 -1
  56. package/lib/Types/Call.d.ts +10 -1
  57. package/lib/Types/Call.d.ts.map +1 -1
  58. package/lib/Types/Contact.d.ts +2 -0
  59. package/lib/Types/Contact.d.ts.map +1 -1
  60. package/lib/Types/Events.d.ts +60 -6
  61. package/lib/Types/Events.d.ts.map +1 -1
  62. package/lib/Types/GroupMetadata.d.ts +4 -0
  63. package/lib/Types/GroupMetadata.d.ts.map +1 -1
  64. package/lib/Types/Message.d.ts +530 -16
  65. package/lib/Types/Message.d.ts.map +1 -1
  66. package/lib/Types/Message.js.map +1 -1
  67. package/lib/Types/Newsletter.d.ts +32 -45
  68. package/lib/Types/Newsletter.d.ts.map +1 -1
  69. package/lib/Types/Newsletter.js +25 -23
  70. package/lib/Types/Newsletter.js.map +1 -1
  71. package/lib/Types/State.d.ts +54 -0
  72. package/lib/Types/State.d.ts.map +1 -1
  73. package/lib/Types/State.js +42 -0
  74. package/lib/Types/State.js.map +1 -1
  75. package/lib/Types/index.d.ts +9 -0
  76. package/lib/Types/index.d.ts.map +1 -1
  77. package/lib/Types/index.js.map +1 -1
  78. package/lib/Utils/auth-utils.d.ts.map +1 -1
  79. package/lib/Utils/auth-utils.js +53 -20
  80. package/lib/Utils/auth-utils.js.map +1 -1
  81. package/lib/Utils/browser-utils.d.ts +13 -0
  82. package/lib/Utils/browser-utils.d.ts.map +1 -1
  83. package/lib/Utils/browser-utils.js +90 -10
  84. package/lib/Utils/browser-utils.js.map +1 -1
  85. package/lib/Utils/chat-utils.d.ts +30 -0
  86. package/lib/Utils/chat-utils.d.ts.map +1 -1
  87. package/lib/Utils/chat-utils.js +134 -59
  88. package/lib/Utils/chat-utils.js.map +1 -1
  89. package/lib/Utils/companion-reg-client-utils.d.ts +17 -0
  90. package/lib/Utils/companion-reg-client-utils.d.ts.map +1 -0
  91. package/lib/Utils/companion-reg-client-utils.js +34 -0
  92. package/lib/Utils/companion-reg-client-utils.js.map +1 -0
  93. package/lib/Utils/crypto.d.ts +4 -8
  94. package/lib/Utils/crypto.d.ts.map +1 -1
  95. package/lib/Utils/crypto.js +2 -26
  96. package/lib/Utils/crypto.js.map +1 -1
  97. package/lib/Utils/decode-wa-message.d.ts +12 -0
  98. package/lib/Utils/decode-wa-message.d.ts.map +1 -1
  99. package/lib/Utils/decode-wa-message.js +16 -0
  100. package/lib/Utils/decode-wa-message.js.map +1 -1
  101. package/lib/Utils/event-buffer.d.ts.map +1 -1
  102. package/lib/Utils/event-buffer.js +43 -8
  103. package/lib/Utils/event-buffer.js.map +1 -1
  104. package/lib/Utils/generics.d.ts +3 -1
  105. package/lib/Utils/generics.d.ts.map +1 -1
  106. package/lib/Utils/generics.js +17 -4
  107. package/lib/Utils/generics.js.map +1 -1
  108. package/lib/Utils/history.d.ts +8 -3
  109. package/lib/Utils/history.d.ts.map +1 -1
  110. package/lib/Utils/history.js +60 -16
  111. package/lib/Utils/history.js.map +1 -1
  112. package/lib/Utils/identity-change-handler.d.ts +44 -0
  113. package/lib/Utils/identity-change-handler.d.ts.map +1 -0
  114. package/lib/Utils/identity-change-handler.js +50 -0
  115. package/lib/Utils/identity-change-handler.js.map +1 -0
  116. package/lib/Utils/index.d.ts +6 -0
  117. package/lib/Utils/index.d.ts.map +1 -1
  118. package/lib/Utils/index.js +6 -0
  119. package/lib/Utils/index.js.map +1 -1
  120. package/lib/Utils/interactive-message.d.ts +201 -0
  121. package/lib/Utils/interactive-message.d.ts.map +1 -0
  122. package/lib/Utils/interactive-message.js +256 -0
  123. package/lib/Utils/interactive-message.js.map +1 -0
  124. package/lib/Utils/lt-hash.d.ts +7 -12
  125. package/lib/Utils/lt-hash.d.ts.map +1 -1
  126. package/lib/Utils/lt-hash.js +2 -42
  127. package/lib/Utils/lt-hash.js.map +1 -1
  128. package/lib/Utils/make-mutex.d.ts +1 -0
  129. package/lib/Utils/make-mutex.d.ts.map +1 -1
  130. package/lib/Utils/make-mutex.js +20 -27
  131. package/lib/Utils/make-mutex.js.map +1 -1
  132. package/lib/Utils/message-composer.d.ts +5 -0
  133. package/lib/Utils/message-composer.d.ts.map +1 -0
  134. package/lib/Utils/message-composer.js +5 -0
  135. package/lib/Utils/message-composer.js.map +1 -0
  136. package/lib/Utils/message-retry-manager.d.ts +30 -2
  137. package/lib/Utils/message-retry-manager.d.ts.map +1 -1
  138. package/lib/Utils/message-retry-manager.js +58 -5
  139. package/lib/Utils/message-retry-manager.js.map +1 -1
  140. package/lib/Utils/messages-media.d.ts +35 -5
  141. package/lib/Utils/messages-media.d.ts.map +1 -1
  142. package/lib/Utils/messages-media.js +171 -51
  143. package/lib/Utils/messages-media.js.map +1 -1
  144. package/lib/Utils/messages.d.ts +2 -0
  145. package/lib/Utils/messages.d.ts.map +1 -1
  146. package/lib/Utils/messages.js +475 -35
  147. package/lib/Utils/messages.js.map +1 -1
  148. package/lib/Utils/noise-handler.d.ts +4 -4
  149. package/lib/Utils/noise-handler.d.ts.map +1 -1
  150. package/lib/Utils/noise-handler.js +139 -85
  151. package/lib/Utils/noise-handler.js.map +1 -1
  152. package/lib/Utils/offline-node-processor.d.ts +17 -0
  153. package/lib/Utils/offline-node-processor.d.ts.map +1 -0
  154. package/lib/Utils/offline-node-processor.js +40 -0
  155. package/lib/Utils/offline-node-processor.js.map +1 -0
  156. package/lib/Utils/process-message.d.ts.map +1 -1
  157. package/lib/Utils/process-message.js +115 -16
  158. package/lib/Utils/process-message.js.map +1 -1
  159. package/lib/Utils/reporting-utils.d.ts +11 -0
  160. package/lib/Utils/reporting-utils.d.ts.map +1 -0
  161. package/lib/Utils/reporting-utils.js +258 -0
  162. package/lib/Utils/reporting-utils.js.map +1 -0
  163. package/lib/Utils/stanza-ack.d.ts +11 -0
  164. package/lib/Utils/stanza-ack.d.ts.map +1 -0
  165. package/lib/Utils/stanza-ack.js +38 -0
  166. package/lib/Utils/stanza-ack.js.map +1 -0
  167. package/lib/Utils/sync-action-utils.d.ts +19 -0
  168. package/lib/Utils/sync-action-utils.d.ts.map +1 -0
  169. package/lib/Utils/sync-action-utils.js +49 -0
  170. package/lib/Utils/sync-action-utils.js.map +1 -0
  171. package/lib/Utils/tc-token-utils.d.ts +37 -0
  172. package/lib/Utils/tc-token-utils.d.ts.map +1 -0
  173. package/lib/Utils/tc-token-utils.js +163 -0
  174. package/lib/Utils/tc-token-utils.js.map +1 -0
  175. package/lib/Utils/use-mongo-file-auth-state.d.ts +16 -0
  176. package/lib/Utils/use-mongo-file-auth-state.d.ts.map +1 -0
  177. package/lib/Utils/use-mongo-file-auth-state.js +60 -0
  178. package/lib/Utils/use-mongo-file-auth-state.js.map +1 -0
  179. package/lib/Utils/use-multi-file-auth-state.js +1 -1
  180. package/lib/Utils/use-multi-file-auth-state.js.map +1 -1
  181. package/lib/Utils/use-single-file-auth-state.d.ts.map +1 -1
  182. package/lib/Utils/use-single-file-auth-state.js.map +1 -1
  183. package/lib/Utils/validate-connection.d.ts.map +1 -1
  184. package/lib/Utils/validate-connection.js +11 -1
  185. package/lib/Utils/validate-connection.js.map +1 -1
  186. package/lib/WABinary/decode.d.ts.map +1 -1
  187. package/lib/WABinary/decode.js +24 -0
  188. package/lib/WABinary/decode.js.map +1 -1
  189. package/lib/WABinary/encode.js +5 -1
  190. package/lib/WABinary/encode.js.map +1 -1
  191. package/lib/WABinary/generic-utils.d.ts +10 -1
  192. package/lib/WABinary/generic-utils.d.ts.map +1 -1
  193. package/lib/WABinary/generic-utils.js +42 -8
  194. package/lib/WABinary/generic-utils.js.map +1 -1
  195. package/lib/WABinary/jid-utils.js.map +1 -1
  196. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts.map +1 -1
  197. package/lib/WAUSync/Protocols/USyncContactProtocol.js +26 -3
  198. package/lib/WAUSync/Protocols/USyncContactProtocol.js.map +1 -1
  199. package/lib/WAUSync/Protocols/USyncUsernameProtocol.d.ts +10 -0
  200. package/lib/WAUSync/Protocols/USyncUsernameProtocol.d.ts.map +1 -0
  201. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +25 -0
  202. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js.map +1 -0
  203. package/lib/WAUSync/Protocols/index.d.ts +1 -0
  204. package/lib/WAUSync/Protocols/index.d.ts.map +1 -1
  205. package/lib/WAUSync/Protocols/index.js +1 -0
  206. package/lib/WAUSync/Protocols/index.js.map +1 -1
  207. package/lib/WAUSync/USyncQuery.d.ts +1 -0
  208. package/lib/WAUSync/USyncQuery.d.ts.map +1 -1
  209. package/lib/WAUSync/USyncQuery.js +6 -2
  210. package/lib/WAUSync/USyncQuery.js.map +1 -1
  211. package/lib/WAUSync/USyncUser.d.ts +4 -0
  212. package/lib/WAUSync/USyncUser.d.ts.map +1 -1
  213. package/lib/WAUSync/USyncUser.js +8 -0
  214. package/lib/WAUSync/USyncUser.js.map +1 -1
  215. package/lib/addons/anti-delete.d.ts +72 -0
  216. package/lib/addons/anti-delete.d.ts.map +1 -0
  217. package/lib/addons/anti-delete.js +165 -0
  218. package/lib/addons/anti-delete.js.map +1 -0
  219. package/lib/addons/auto-reply.d.ts +67 -0
  220. package/lib/addons/auto-reply.d.ts.map +1 -0
  221. package/lib/addons/auto-reply.js +145 -0
  222. package/lib/addons/auto-reply.js.map +1 -0
  223. package/lib/addons/browser-presets.d.ts +16 -0
  224. package/lib/addons/browser-presets.d.ts.map +1 -0
  225. package/lib/addons/browser-presets.js +24 -0
  226. package/lib/addons/browser-presets.js.map +1 -0
  227. package/lib/addons/button-sender.d.ts +260 -0
  228. package/lib/addons/button-sender.d.ts.map +1 -0
  229. package/lib/addons/button-sender.js +771 -0
  230. package/lib/addons/button-sender.js.map +1 -0
  231. package/lib/addons/call-handler.d.ts +79 -0
  232. package/lib/addons/call-handler.d.ts.map +1 -0
  233. package/lib/addons/call-handler.js +342 -0
  234. package/lib/addons/call-handler.js.map +1 -0
  235. package/lib/addons/from-chats.d.ts +30 -0
  236. package/lib/addons/from-chats.d.ts.map +1 -0
  237. package/lib/addons/from-chats.js +38 -0
  238. package/lib/addons/from-chats.js.map +1 -0
  239. package/lib/addons/from-messages-recv.d.ts +59 -0
  240. package/lib/addons/from-messages-recv.d.ts.map +1 -0
  241. package/lib/addons/from-messages-recv.js +326 -0
  242. package/lib/addons/from-messages-recv.js.map +1 -0
  243. package/lib/addons/from-messages-send.d.ts +50 -0
  244. package/lib/addons/from-messages-send.d.ts.map +1 -0
  245. package/lib/addons/from-messages-send.js +148 -0
  246. package/lib/addons/from-messages-send.js.map +1 -0
  247. package/lib/addons/from-messages.d.ts +52 -0
  248. package/lib/addons/from-messages.d.ts.map +1 -0
  249. package/lib/addons/from-messages.js +304 -0
  250. package/lib/addons/from-messages.js.map +1 -0
  251. package/lib/addons/index.d.ts +67 -0
  252. package/lib/addons/index.d.ts.map +1 -0
  253. package/lib/addons/index.js +86 -0
  254. package/lib/addons/index.js.map +1 -0
  255. package/lib/addons/interactive-message.d.ts +201 -0
  256. package/lib/addons/interactive-message.d.ts.map +1 -0
  257. package/lib/addons/interactive-message.js +256 -0
  258. package/lib/addons/interactive-message.js.map +1 -0
  259. package/lib/addons/jid-plot.d.ts +49 -0
  260. package/lib/addons/jid-plot.d.ts.map +1 -0
  261. package/lib/addons/jid-plot.js +84 -0
  262. package/lib/addons/jid-plot.js.map +1 -0
  263. package/lib/addons/jid-plotting.d.ts +54 -0
  264. package/lib/addons/jid-plotting.d.ts.map +1 -0
  265. package/lib/addons/jid-plotting.js +150 -0
  266. package/lib/addons/jid-plotting.js.map +1 -0
  267. package/lib/addons/lid-support.d.ts +41 -0
  268. package/lib/addons/lid-support.d.ts.map +1 -0
  269. package/lib/addons/lid-support.js +42 -0
  270. package/lib/addons/lid-support.js.map +1 -0
  271. package/lib/addons/message-composer.d.ts +142 -0
  272. package/lib/addons/message-composer.d.ts.map +1 -0
  273. package/lib/addons/message-composer.js +377 -0
  274. package/lib/addons/message-composer.js.map +1 -0
  275. package/lib/addons/message-scheduler.d.ts +77 -0
  276. package/lib/addons/message-scheduler.d.ts.map +1 -0
  277. package/lib/addons/message-scheduler.js +108 -0
  278. package/lib/addons/message-scheduler.js.map +1 -0
  279. package/lib/addons/message-search.d.ts +51 -0
  280. package/lib/addons/message-search.d.ts.map +1 -0
  281. package/lib/addons/message-search.js +171 -0
  282. package/lib/addons/message-search.js.map +1 -0
  283. package/lib/addons/message-utils.d.ts +88 -0
  284. package/lib/addons/message-utils.d.ts.map +1 -0
  285. package/lib/addons/message-utils.js +292 -0
  286. package/lib/addons/message-utils.js.map +1 -0
  287. package/lib/addons/outgoing-calls.d.ts +64 -0
  288. package/lib/addons/outgoing-calls.d.ts.map +1 -0
  289. package/lib/addons/outgoing-calls.js +139 -0
  290. package/lib/addons/outgoing-calls.js.map +1 -0
  291. package/lib/addons/pairing-fix.d.ts +31 -0
  292. package/lib/addons/pairing-fix.d.ts.map +1 -0
  293. package/lib/addons/pairing-fix.js +74 -0
  294. package/lib/addons/pairing-fix.js.map +1 -0
  295. package/lib/addons/past-participants.d.ts +42 -0
  296. package/lib/addons/past-participants.d.ts.map +1 -0
  297. package/lib/addons/past-participants.js +41 -0
  298. package/lib/addons/past-participants.js.map +1 -0
  299. package/lib/addons/rich-response.d.ts +111 -0
  300. package/lib/addons/rich-response.d.ts.map +1 -0
  301. package/lib/addons/rich-response.js +152 -0
  302. package/lib/addons/rich-response.js.map +1 -0
  303. package/lib/addons/scheduling.d.ts +41 -0
  304. package/lib/addons/scheduling.d.ts.map +1 -0
  305. package/lib/addons/scheduling.js +110 -0
  306. package/lib/addons/scheduling.js.map +1 -0
  307. package/lib/addons/status-posting.d.ts +177 -0
  308. package/lib/addons/status-posting.d.ts.map +1 -0
  309. package/lib/addons/status-posting.js +240 -0
  310. package/lib/addons/status-posting.js.map +1 -0
  311. package/lib/addons/stickerpack.d.ts +37 -0
  312. package/lib/addons/stickerpack.d.ts.map +1 -0
  313. package/lib/addons/stickerpack.js +39 -0
  314. package/lib/addons/stickerpack.js.map +1 -0
  315. package/lib/addons/templates.d.ts +72 -0
  316. package/lib/addons/templates.d.ts.map +1 -0
  317. package/lib/addons/templates.js +145 -0
  318. package/lib/addons/templates.js.map +1 -0
  319. package/lib/addons/vcard.d.ts +59 -0
  320. package/lib/addons/vcard.d.ts.map +1 -0
  321. package/lib/addons/vcard.js +88 -0
  322. package/lib/addons/vcard.js.map +1 -0
  323. package/lib/index.d.ts +1 -0
  324. package/lib/index.d.ts.map +1 -1
  325. package/lib/index.js +1 -0
  326. package/lib/index.js.map +1 -1
  327. package/package.json +6 -3
@@ -1,4 +1,17 @@
1
1
  import type { BrowsersMap } from '../Types/index.js';
2
2
  export declare const Browsers: BrowsersMap;
3
+ /**
4
+ * Checks if the browser tuple represents an Android companion device.
5
+ */
6
+ export declare const isAndroidBrowser: (browser: [string, string, string]) => boolean;
7
+ /**
8
+ * Returns a numeric platform ID string for the given browser name.
9
+ * Falls back to Chrome (1) for unknown/non-browser platforms.
10
+ */
3
11
  export declare const getPlatformId: (browser: string) => string;
12
+ /**
13
+ * Returns the display name for the given browser type.
14
+ * Falls back to 'Chrome' if browser type is not a known platform type.
15
+ */
16
+ export declare const getPlatformDisplayName: (browser: string) => string;
4
17
  //# sourceMappingURL=browser-utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser-utils.d.ts","sourceRoot":"","sources":["../../src/Utils/browser-utils.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAgB3C,eAAO,MAAM,QAAQ,EAAE,WAOtB,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,SAAS,MAAM,WAG5C,CAAA"}
1
+ {"version":3,"file":"browser-utils.d.ts","sourceRoot":"","sources":["../../src/Utils/browser-utils.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAmD3C,eAAO,MAAM,QAAQ,EAAE,WAyBtB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAAI,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,KAAG,OAEpE,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,SAAS,MAAM,WAe5C,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,sBAAsB,GAAI,SAAS,MAAM,WAGrD,CAAA"}
@@ -8,21 +8,101 @@ const PLATFORM_MAP = {
8
8
  freebsd: 'FreeBSD',
9
9
  openbsd: 'OpenBSD',
10
10
  sunos: 'Solaris',
11
- linux: undefined,
12
- haiku: undefined,
13
- cygwin: undefined,
14
- netbsd: undefined
11
+ linux: 'Linux',
12
+ ubuntu: 'Ubuntu',
13
+ ios: 'iOS',
14
+ baileys: 'Baileys',
15
+ chromeos: 'Chrome OS',
16
+ tizen: 'Tizen',
17
+ watchos: 'watchOS',
18
+ wearos: 'Wear OS',
19
+ harmonyos: 'HarmonyOS',
20
+ kaios: 'KaiOS',
21
+ smarttv: 'Smart TV',
22
+ raspberrypi: 'Raspberry Pi OS',
23
+ symbian: 'Symbian',
24
+ blackberry: 'Blackberry OS',
25
+ windowsphone: 'Windows Phone'
26
+ };
27
+ const PLATFORM_VERSIONS = {
28
+ ubuntu: '22.04.4',
29
+ darwin: '18.5',
30
+ win32: '10.0.22631',
31
+ android: '14.0.0',
32
+ freebsd: '13.2',
33
+ openbsd: '7.3',
34
+ sunos: '11',
35
+ linux: '6.5',
36
+ ios: '18.2',
37
+ baileys: '6.5.0',
38
+ chromeos: '117.0.5938.132',
39
+ tizen: '6.5',
40
+ watchos: '10.1',
41
+ wearos: '4.1',
42
+ harmonyos: '4.0.0',
43
+ kaios: '3.1',
44
+ smarttv: '23.3.1',
45
+ raspberrypi: '11 (Bullseye)',
46
+ symbian: '3',
47
+ blackberry: '10.3.3',
48
+ windowsphone: '8.1'
15
49
  };
16
50
  export const Browsers = {
17
- ubuntu: browser => ['Ubuntu', browser, '22.04.4'],
18
- macOS: browser => ['Mac OS', browser, '14.4.1'],
19
- baileys: browser => ['Baileys', browser, '6.5.0'],
20
- windows: browser => ['Windows', browser, '10.0.22631'],
51
+ ubuntu: browser => ['Ubuntu', browser, PLATFORM_VERSIONS['ubuntu']],
52
+ macOS: browser => ['Mac OS', browser, PLATFORM_VERSIONS['darwin']],
53
+ baileys: browser => ['Baileys', browser, PLATFORM_VERSIONS['baileys']],
54
+ windows: browser => ['Windows', browser, PLATFORM_VERSIONS['win32']],
55
+ linux: browser => ['Linux', browser, PLATFORM_VERSIONS['linux']],
56
+ /** iOS device */
57
+ iOS: browser => ['iOS', browser, PLATFORM_VERSIONS['ios']],
58
+ /** Android companion device — apiLevel is the Android API level e.g. '14' */
59
+ android: (apiLevel) => [apiLevel, 'Android', ''],
60
+ /** Alias for android companion used by pairing code flow */
61
+ androidCompanion: (apiLevel) => [apiLevel, 'Android', ''],
62
+ kaiOS: browser => ['KaiOS', browser, PLATFORM_VERSIONS['kaios']],
63
+ chromeOS: browser => ['Chrome OS', browser, PLATFORM_VERSIONS['chromeos']],
21
64
  /** The appropriate browser based on your OS & release */
22
- appropriate: browser => [PLATFORM_MAP[platform()] || 'Ubuntu', browser, release()]
65
+ appropriate: browser => {
66
+ const os = platform();
67
+ const platformName = PLATFORM_MAP[os] || 'Unknown OS';
68
+ return [platformName, browser, PLATFORM_VERSIONS[os] || release()];
69
+ },
70
+ /** Fully custom browser tuple */
71
+ custom: (os, browser, version) => {
72
+ const platformName = PLATFORM_MAP[os.toLowerCase()] || os;
73
+ return [platformName, browser, version || PLATFORM_VERSIONS[os] || 'latest'];
74
+ }
75
+ };
76
+ /**
77
+ * Checks if the browser tuple represents an Android companion device.
78
+ */
79
+ export const isAndroidBrowser = (browser) => {
80
+ return browser[1]?.toUpperCase() === 'ANDROID';
23
81
  };
82
+ /**
83
+ * Returns a numeric platform ID string for the given browser name.
84
+ * Falls back to Chrome (1) for unknown/non-browser platforms.
85
+ */
24
86
  export const getPlatformId = (browser) => {
25
87
  const platformType = proto.DeviceProps.PlatformType[browser.toUpperCase()];
26
- return platformType ? platformType.toString() : '1'; //chrome
88
+ if (platformType !== undefined) {
89
+ return platformType.toString();
90
+ }
91
+ // 'ANDROID' not in PlatformType enum — map to ANDROID_PHONE
92
+ if (browser.toUpperCase() === 'ANDROID') {
93
+ const androidPhone = proto.DeviceProps.PlatformType['ANDROID_PHONE'];
94
+ if (androidPhone !== undefined) {
95
+ return androidPhone.toString();
96
+ }
97
+ }
98
+ return (proto.DeviceProps.PlatformType.CHROME || 1).toString();
99
+ };
100
+ /**
101
+ * Returns the display name for the given browser type.
102
+ * Falls back to 'Chrome' if browser type is not a known platform type.
103
+ */
104
+ export const getPlatformDisplayName = (browser) => {
105
+ const platformType = proto.DeviceProps.PlatformType[browser.toUpperCase()];
106
+ return platformType !== undefined ? browser : 'Chrome';
27
107
  };
28
108
  //# sourceMappingURL=browser-utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser-utils.js","sourceRoot":"","sources":["../../src/Utils/browser-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,IAAI,CAAA;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAG9C,MAAM,YAAY,GAAG;IACpB,GAAG,EAAE,KAAK;IACV,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,SAAS;IAChB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,SAAS;IACjB,MAAM,EAAE,SAAS;CACjB,CAAA;AAED,MAAM,CAAC,MAAM,QAAQ,GAAgB;IACpC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC;IACjD,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC;IAC/C,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC;IACjD,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,YAAY,CAAC;IACtD,yDAAyD;IACzD,WAAW,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,IAAI,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;CAClF,CAAA;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,OAAe,EAAE,EAAE;IAChD,MAAM,YAAY,GAAG,KAAK,CAAC,WAAW,CAAC,YAAY,CAAC,OAAO,CAAC,WAAW,EAAS,CAAC,CAAA;IACjF,OAAO,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,CAAA,CAAC,QAAQ;AAC7D,CAAC,CAAA"}
1
+ {"version":3,"file":"browser-utils.js","sourceRoot":"","sources":["../../src/Utils/browser-utils.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,37 @@ type FetchAppStateSyncKey = (keyId: string) => Promise<proto.Message.IAppStateSy
6
6
  export type ChatMutationMap = {
7
7
  [index: string]: ChatMutation;
8
8
  };
9
+ type Mac = {
10
+ indexMac: Uint8Array;
11
+ valueMac: Uint8Array;
12
+ operation: proto.SyncdMutation.SyncdOperation;
13
+ };
14
+ export declare const makeLtHashGenerator: ({ indexValueMap, hash }: Pick<LTHashState, "hash" | "indexValueMap">) => {
15
+ mix: ({ indexMac, valueMac, operation }: Mac) => void;
16
+ finish: () => {
17
+ hash: Buffer<ArrayBuffer>;
18
+ indexValueMap: {
19
+ [indexMacBase64: string]: {
20
+ valueMac: Uint8Array | Buffer;
21
+ };
22
+ };
23
+ };
24
+ };
9
25
  export declare const newLTHashState: () => LTHashState;
26
+ export declare const ensureLTHashStateVersion: (state: LTHashState) => LTHashState;
27
+ export declare const MAX_SYNC_ATTEMPTS = 2;
28
+ /**
29
+ * Check if an error is a missing app state sync key.
30
+ * WA Web treats these as "Blocked" (waits for key arrival), not fatal.
31
+ * In Baileys we retry with a snapshot which may use a different key.
32
+ */
33
+ export declare const isMissingKeyError: (error: any) => boolean;
34
+ /**
35
+ * Determines if an app state sync error is unrecoverable.
36
+ * TypeError indicates a WASM crash; otherwise we give up after MAX_SYNC_ATTEMPTS.
37
+ * Missing keys are NOT checked here — they are handled separately as "Blocked".
38
+ */
39
+ export declare const isAppStateSyncIrrecoverable: (error: any, attempts: number) => boolean;
10
40
  export declare const encodeSyncdPatch: ({ type, index, syncAction, apiVersion, operation }: WAPatchCreate, myAppStateKeyId: string, state: LTHashState, getAppStateSyncKey: FetchAppStateSyncKey) => Promise<{
11
41
  patch: proto.ISyncdPatch;
12
42
  state: LTHashState;
@@ -1 +1 @@
1
- {"version":3,"file":"chat-utils.d.ts","sourceRoot":"","sources":["../../src/Utils/chat-utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAC9C,OAAO,KAAK,EACX,mBAAmB,EAEnB,gBAAgB,EAChB,YAAY,EAEZ,OAAO,EACP,0BAA0B,EAE1B,WAAW,EACX,aAAa,EACb,WAAW,EACX,MAAM,UAAU,CAAA;AAMjB,OAAO,EAAE,KAAK,UAAU,EAA4E,MAAM,aAAa,CAAA;AAGvH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAIvC,KAAK,oBAAoB,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,oBAAoB,GAAG,IAAI,GAAG,SAAS,CAAC,CAAA;AAE7G,MAAM,MAAM,eAAe,GAAG;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,CAAA;CAAE,CAAA;AA4G/D,eAAO,MAAM,cAAc,QAAO,WAA2E,CAAA;AAE7G,eAAO,MAAM,gBAAgB,GAC5B,oDAAoD,aAAa,EACjE,iBAAiB,MAAM,EACvB,OAAO,WAAW,EAClB,oBAAoB,oBAAoB;;;EA2DxC,CAAA;AAED,eAAO,MAAM,oBAAoB,GAChC,cAAc,CAAC,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC,YAAY,CAAC,EAAE,EAC3D,cAAc,WAAW,EACzB,oBAAoB,oBAAoB,EACxC,YAAY,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,EAC5C,cAAc,OAAO;;;;;;;EA0DrB,CAAA;AAED,eAAO,MAAM,gBAAgB,GAC5B,KAAK,KAAK,CAAC,WAAW,EACtB,MAAM,WAAW,EACjB,cAAc,WAAW,EACzB,oBAAoB,oBAAoB,EACxC,YAAY,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,EAC5C,cAAc,OAAO;;;;;;;EA0BrB,CAAA;AAED,eAAO,MAAM,mBAAmB,GAAU,QAAQ,UAAU,EAAE,SAAS,WAAW;;iBAKjD,KAAK,CAAC,WAAW,EAAE;wBAAkB,OAAO;mBAAa,KAAK,CAAC,cAAc;;;iBAA7E,KAAK,CAAC,WAAW,EAAE;wBAAkB,OAAO;mBAAa,KAAK,CAAC,cAAc;;;iBAA7E,KAAK,CAAC,WAAW,EAAE;wBAAkB,OAAO;mBAAa,KAAK,CAAC,cAAc;;;iBAA7E,KAAK,CAAC,WAAW,EAAE;wBAAkB,OAAO;mBAAa,KAAK,CAAC,cAAc;;;iBAA7E,KAAK,CAAC,WAAW,EAAE;wBAAkB,OAAO;mBAAa,KAAK,CAAC,cAAc;;EA6C7G,CAAA;AAED,eAAO,MAAM,oBAAoB,GAAU,MAAM,KAAK,CAAC,sBAAsB,EAAE,SAAS,WAAW,iCAQlG,CAAA;AAED,eAAO,MAAM,qBAAqB,GAAU,MAAM,KAAK,CAAC,sBAAsB,EAAE,SAAS,WAAW,kCAInG,CAAA;AAED,eAAO,MAAM,mBAAmB,GAC/B,MAAM,WAAW,EACjB,UAAU,KAAK,CAAC,cAAc,EAC9B,oBAAoB,oBAAoB,EACxC,sBAAsB,MAAM,GAAG,SAAS,EACxC,sBAAmB;;;EAyCnB,CAAA;AAED,eAAO,MAAM,aAAa,GACzB,MAAM,WAAW,EACjB,QAAQ,KAAK,CAAC,WAAW,EAAE,EAC3B,SAAS,WAAW,EACpB,oBAAoB,oBAAoB,EACxC,SAAS,WAAW,EACpB,uBAAuB,MAAM,EAC7B,SAAS,OAAO,EAChB,sBAAmB;;;EA2DnB,CAAA;AAED,eAAO,MAAM,0BAA0B,GAAI,KAAK,gBAAgB,EAAE,KAAK,MAAM,kBAyQ5E,CAAA;AAED,eAAO,MAAM,iBAAiB,GAC7B,YAAY,YAAY,EACxB,IAAI,mBAAmB,EACvB,IAAI,OAAO,EACX,kBAAkB,0BAA0B,EAC5C,SAAS,OAAO,SA4KhB,CAAA"}
1
+ {"version":3,"file":"chat-utils.d.ts","sourceRoot":"","sources":["../../src/Utils/chat-utils.ts"],"names":[],"mappings":"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"}
@@ -1,48 +1,44 @@
1
1
  import { Boom } from '@hapi/boom';
2
+ import { expandAppStateKeys } from 'whatsapp-rust-bridge';
2
3
  import { proto } from '../../WAProto/index.js';
3
4
  import { LabelAssociationType } from '../Types/LabelAssociation.js';
4
5
  import { getBinaryNodeChild, getBinaryNodeChildren, isJidGroup, jidNormalizedUser } from '../WABinary/index.js';
5
- import { aesDecrypt, aesEncrypt, hkdf, hmacSign } from './crypto.js';
6
+ import { aesDecrypt, aesEncrypt, hmacSign } from './crypto.js';
6
7
  import { toNumber } from './generics.js';
7
8
  import { LT_HASH_ANTI_TAMPERING } from './lt-hash.js';
8
9
  import { downloadContentFromMessage } from './messages-media.js';
9
- const mutationKeys = async (keydata) => {
10
- const expanded = await hkdf(keydata, 160, { info: 'WhatsApp Mutation Keys' });
10
+ import { emitSyncActionResults, processContactAction } from './sync-action-utils.js';
11
+ const mutationKeys = (keydata) => {
12
+ const keys = expandAppStateKeys(keydata);
11
13
  return {
12
- indexKey: expanded.slice(0, 32),
13
- valueEncryptionKey: expanded.slice(32, 64),
14
- valueMacKey: expanded.slice(64, 96),
15
- snapshotMacKey: expanded.slice(96, 128),
16
- patchMacKey: expanded.slice(128, 160)
14
+ indexKey: keys.indexKey,
15
+ valueEncryptionKey: keys.valueEncryptionKey,
16
+ valueMacKey: keys.valueMacKey,
17
+ snapshotMacKey: keys.snapshotMacKey,
18
+ patchMacKey: keys.patchMacKey
17
19
  };
18
20
  };
19
21
  const generateMac = (operation, data, keyId, key) => {
20
- const getKeyData = () => {
21
- let r;
22
- switch (operation) {
23
- case proto.SyncdMutation.SyncdOperation.SET:
24
- r = 0x01;
25
- break;
26
- case proto.SyncdMutation.SyncdOperation.REMOVE:
27
- r = 0x02;
28
- break;
29
- }
30
- const buff = Buffer.from([r]);
31
- return Buffer.concat([buff, Buffer.from(keyId, 'base64')]);
32
- };
33
- const keyData = getKeyData();
34
- const last = Buffer.alloc(8); // 8 bytes
35
- last.set([keyData.length], last.length - 1);
36
- const total = Buffer.concat([keyData, data, last]);
22
+ const opByte = operation === proto.SyncdMutation.SyncdOperation.SET ? 0x01 : 0x02;
23
+ const keyIdBuffer = typeof keyId === 'string' ? Buffer.from(keyId, 'base64') : keyId;
24
+ const keyData = new Uint8Array(1 + keyIdBuffer.length);
25
+ keyData[0] = opByte;
26
+ keyData.set(keyIdBuffer, 1);
27
+ const last = new Uint8Array(8);
28
+ last[7] = keyData.length;
29
+ const total = new Uint8Array(keyData.length + data.length + last.length);
30
+ total.set(keyData, 0);
31
+ total.set(data, keyData.length);
32
+ total.set(last, keyData.length + data.length);
37
33
  const hmac = hmacSign(total, key, 'sha512');
38
- return hmac.slice(0, 32);
34
+ return hmac.subarray(0, 32);
39
35
  };
40
36
  const to64BitNetworkOrder = (e) => {
41
37
  const buff = Buffer.alloc(8);
42
38
  buff.writeUint32BE(e, 4);
43
39
  return buff;
44
40
  };
45
- const makeLtHashGenerator = ({ indexValueMap, hash }) => {
41
+ export const makeLtHashGenerator = ({ indexValueMap, hash }) => {
46
42
  indexValueMap = { ...indexValueMap };
47
43
  const addBuffs = [];
48
44
  const subBuffs = [];
@@ -52,26 +48,27 @@ const makeLtHashGenerator = ({ indexValueMap, hash }) => {
52
48
  const prevOp = indexValueMap[indexMacBase64];
53
49
  if (operation === proto.SyncdMutation.SyncdOperation.REMOVE) {
54
50
  if (!prevOp) {
55
- throw new Boom('tried remove, but no previous op', { data: { indexMac, valueMac } });
51
+ // WA Web does not throw here it logs a warning and skips the subtract.
52
+ // The missing REMOVE will cause an LTHash mismatch, which is handled
53
+ // by the MAC validation layer (snapshot recovery or retry).
54
+ return;
56
55
  }
57
56
  // remove from index value mac, since this mutation is erased
58
57
  delete indexValueMap[indexMacBase64];
59
58
  }
60
59
  else {
61
- addBuffs.push(new Uint8Array(valueMac).buffer);
60
+ addBuffs.push(valueMac);
62
61
  // add this index into the history map
63
62
  indexValueMap[indexMacBase64] = { valueMac };
64
63
  }
65
64
  if (prevOp) {
66
- subBuffs.push(new Uint8Array(prevOp.valueMac).buffer);
65
+ subBuffs.push(prevOp.valueMac);
67
66
  }
68
67
  },
69
- finish: async () => {
70
- const hashArrayBuffer = new Uint8Array(hash).buffer;
71
- const result = await LT_HASH_ANTI_TAMPERING.subtractThenAdd(hashArrayBuffer, addBuffs, subBuffs);
72
- const buffer = Buffer.from(result);
68
+ finish: () => {
69
+ const result = LT_HASH_ANTI_TAMPERING.subtractThenAdd(hash, subBuffs, addBuffs);
73
70
  return {
74
- hash: buffer,
71
+ hash: Buffer.from(result),
75
72
  indexValueMap
76
73
  };
77
74
  }
@@ -86,10 +83,33 @@ const generatePatchMac = (snapshotMac, valueMacs, version, type, key) => {
86
83
  return hmacSign(total, key);
87
84
  };
88
85
  export const newLTHashState = () => ({ version: 0, hash: Buffer.alloc(128), indexValueMap: {} });
86
+ export const ensureLTHashStateVersion = (state) => {
87
+ if (typeof state.version !== 'number' || isNaN(state.version)) {
88
+ state.version = 0;
89
+ }
90
+ return state;
91
+ };
92
+ export const MAX_SYNC_ATTEMPTS = 2;
93
+ /**
94
+ * Check if an error is a missing app state sync key.
95
+ * WA Web treats these as "Blocked" (waits for key arrival), not fatal.
96
+ * In Baileys we retry with a snapshot which may use a different key.
97
+ */
98
+ export const isMissingKeyError = (error) => {
99
+ return error?.data?.isMissingKey === true;
100
+ };
101
+ /**
102
+ * Determines if an app state sync error is unrecoverable.
103
+ * TypeError indicates a WASM crash; otherwise we give up after MAX_SYNC_ATTEMPTS.
104
+ * Missing keys are NOT checked here — they are handled separately as "Blocked".
105
+ */
106
+ export const isAppStateSyncIrrecoverable = (error, attempts) => {
107
+ return attempts >= MAX_SYNC_ATTEMPTS || error?.name === 'TypeError';
108
+ };
89
109
  export const encodeSyncdPatch = async ({ type, index, syncAction, apiVersion, operation }, myAppStateKeyId, state, getAppStateSyncKey) => {
90
110
  const key = !!myAppStateKeyId ? await getAppStateSyncKey(myAppStateKeyId) : undefined;
91
111
  if (!key) {
92
- throw new Boom(`myAppStateKey ("${myAppStateKeyId}") not present`, { statusCode: 404 });
112
+ throw new Boom(`myAppStateKey ("${myAppStateKeyId}") not present`, { data: { isMissingKey: true } });
93
113
  }
94
114
  const encKeyId = Buffer.from(myAppStateKeyId, 'base64');
95
115
  state = { ...state, indexValueMap: { ...state.indexValueMap } };
@@ -101,14 +121,14 @@ export const encodeSyncdPatch = async ({ type, index, syncAction, apiVersion, op
101
121
  version: apiVersion
102
122
  });
103
123
  const encoded = proto.SyncActionData.encode(dataProto).finish();
104
- const keyValue = await mutationKeys(key.keyData);
124
+ const keyValue = mutationKeys(key.keyData);
105
125
  const encValue = aesEncrypt(encoded, keyValue.valueEncryptionKey);
106
126
  const valueMac = generateMac(operation, encValue, encKeyId, keyValue.valueMacKey);
107
127
  const indexMac = hmacSign(indexBuffer, keyValue.indexKey);
108
128
  // update LT hash
109
129
  const generator = makeLtHashGenerator(state);
110
130
  generator.mix({ indexMac, valueMac, operation });
111
- Object.assign(state, await generator.finish());
131
+ Object.assign(state, generator.finish());
112
132
  state.version += 1;
113
133
  const snapshotMac = generateSnapshotMac(state.hash, state.version, type, keyValue.snapshotMacKey);
114
134
  const patch = {
@@ -136,6 +156,7 @@ export const encodeSyncdPatch = async ({ type, index, syncAction, apiVersion, op
136
156
  };
137
157
  export const decodeSyncdMutations = async (msgMutations, initialState, getAppStateSyncKey, onMutation, validateMacs) => {
138
158
  const ltGenerator = makeLtHashGenerator(initialState);
159
+ const derivedKeyCache = new Map();
139
160
  // indexKey used to HMAC sign record.index.blob
140
161
  // valueEncryptionKey used to AES-256-CBC encrypt record.value.blob[0:-32]
141
162
  // the remaining record.value.blob[0:-32] is the mac, it the HMAC sign of key.keyId + decoded proto data + length of bytes in keyId
@@ -145,9 +166,9 @@ export const decodeSyncdMutations = async (msgMutations, initialState, getAppSta
145
166
  const operation = 'operation' in msgMutation ? msgMutation.operation : proto.SyncdMutation.SyncdOperation.SET;
146
167
  const record = 'record' in msgMutation && !!msgMutation.record ? msgMutation.record : msgMutation;
147
168
  const key = await getKey(record.keyId.id);
148
- const content = Buffer.from(record.value.blob);
149
- const encContent = content.slice(0, -32);
150
- const ogValueMac = content.slice(-32);
169
+ const content = record.value.blob;
170
+ const encContent = content.subarray(0, -32);
171
+ const ogValueMac = content.subarray(-32);
151
172
  if (validateMacs) {
152
173
  const contentHmac = generateMac(operation, encContent, record.keyId.id, key.valueMacKey);
153
174
  if (Buffer.compare(contentHmac, ogValueMac) !== 0) {
@@ -170,17 +191,22 @@ export const decodeSyncdMutations = async (msgMutations, initialState, getAppSta
170
191
  operation: operation
171
192
  });
172
193
  }
173
- return await ltGenerator.finish();
194
+ return ltGenerator.finish();
174
195
  async function getKey(keyId) {
175
196
  const base64Key = Buffer.from(keyId).toString('base64');
197
+ const cached = derivedKeyCache.get(base64Key);
198
+ if (cached) {
199
+ return cached;
200
+ }
176
201
  const keyEnc = await getAppStateSyncKey(base64Key);
177
202
  if (!keyEnc) {
178
203
  throw new Boom(`failed to find key "${base64Key}" to decode mutation`, {
179
- statusCode: 404,
180
- data: { msgMutations }
204
+ data: { isMissingKey: true, msgMutations }
181
205
  });
182
206
  }
183
- return mutationKeys(keyEnc.keyData);
207
+ const keys = mutationKeys(keyEnc.keyData);
208
+ derivedKeyCache.set(base64Key, keys);
209
+ return keys;
184
210
  }
185
211
  };
186
212
  export const decodeSyncdPatch = async (msg, name, initialState, getAppStateSyncKey, onMutation, validateMacs) => {
@@ -188,9 +214,9 @@ export const decodeSyncdPatch = async (msg, name, initialState, getAppStateSyncK
188
214
  const base64Key = Buffer.from(msg.keyId.id).toString('base64');
189
215
  const mainKeyObj = await getAppStateSyncKey(base64Key);
190
216
  if (!mainKeyObj) {
191
- throw new Boom(`failed to find key "${base64Key}" to decode patch`, { statusCode: 404, data: { msg } });
217
+ throw new Boom(`failed to find key "${base64Key}" to decode patch`, { data: { isMissingKey: true, msg } });
192
218
  }
193
- const mainKey = await mutationKeys(mainKeyObj.keyData);
219
+ const mainKey = mutationKeys(mainKeyObj.keyData);
194
220
  const mutationmacs = msg.mutations.map(mutation => mutation.record.value.blob.slice(-32));
195
221
  const patchMac = generatePatchMac(msg.snapshotMac, mutationmacs, toNumber(msg.version.version), name, mainKey.patchMacKey);
196
222
  if (Buffer.compare(patchMac, msg.patchMac) !== 0) {
@@ -266,9 +292,9 @@ export const decodeSyncdSnapshot = async (name, snapshot, getAppStateSyncKey, mi
266
292
  const base64Key = Buffer.from(snapshot.keyId.id).toString('base64');
267
293
  const keyEnc = await getAppStateSyncKey(base64Key);
268
294
  if (!keyEnc) {
269
- throw new Boom(`failed to find key "${base64Key}" to decode mutation`);
295
+ throw new Boom(`failed to find key "${base64Key}" to decode mutation`, { data: { isMissingKey: true } });
270
296
  }
271
- const result = await mutationKeys(keyEnc.keyData);
297
+ const result = mutationKeys(keyEnc.keyData);
272
298
  const computedSnapshotMac = generateSnapshotMac(newState.hash, newState.version, name, result.snapshotMacKey);
273
299
  if (Buffer.compare(snapshot.mac, computedSnapshotMac) !== 0) {
274
300
  throw new Boom(`failed to verify LTHash at ${newState.version} of ${name} from snapshot`);
@@ -308,9 +334,9 @@ export const decodePatches = async (name, syncds, initial, getAppStateSyncKey, o
308
334
  const base64Key = Buffer.from(keyId.id).toString('base64');
309
335
  const keyEnc = await getAppStateSyncKey(base64Key);
310
336
  if (!keyEnc) {
311
- throw new Boom(`failed to find key "${base64Key}" to decode mutation`);
337
+ throw new Boom(`failed to find key "${base64Key}" to decode mutation`, { data: { isMissingKey: true } });
312
338
  }
313
- const result = await mutationKeys(keyEnc.keyData);
339
+ const result = mutationKeys(keyEnc.keyData);
314
340
  const computedSnapshotMac = generateSnapshotMac(newState.hash, newState.version, name, result.snapshotMacKey);
315
341
  if (Buffer.compare(snapshotMac, computedSnapshotMac) !== 0) {
316
342
  throw new Boom(`failed to verify LTHash at ${newState.version} of ${name}`);
@@ -665,14 +691,8 @@ export const processSyncAction = (syncAction, ev, me, initialSyncOpts, logger) =
665
691
  });
666
692
  }
667
693
  else if (action?.contactAction) {
668
- ev.emit('contacts.upsert', [
669
- {
670
- id: id,
671
- name: action.contactAction.fullName,
672
- lid: action.contactAction.lidJid || undefined,
673
- phoneNumber: action.contactAction.pnJid || undefined
674
- }
675
- ]);
694
+ const results = processContactAction(action.contactAction, id, logger);
695
+ emitSyncActionResults(ev, results);
676
696
  }
677
697
  else if (action?.pushNameSetting) {
678
698
  const name = action?.pushNameSetting?.name;
@@ -741,6 +761,61 @@ export const processSyncAction = (syncAction, ev, me, initialSyncOpts, logger) =
741
761
  }
742
762
  });
743
763
  }
764
+ else if (action?.localeSetting?.locale) {
765
+ ev.emit('settings.update', { setting: 'locale', value: action.localeSetting.locale });
766
+ }
767
+ else if (action?.timeFormatAction) {
768
+ ev.emit('settings.update', { setting: 'timeFormat', value: action.timeFormatAction });
769
+ }
770
+ else if (action?.pnForLidChatAction) {
771
+ if (action.pnForLidChatAction.pnJid) {
772
+ ev.emit('lid-mapping.update', { lid: id, pn: action.pnForLidChatAction.pnJid });
773
+ }
774
+ }
775
+ else if (action?.privacySettingRelayAllCalls) {
776
+ ev.emit('settings.update', {
777
+ setting: 'privacySettingRelayAllCalls',
778
+ value: action.privacySettingRelayAllCalls
779
+ });
780
+ }
781
+ else if (action?.statusPrivacy) {
782
+ ev.emit('settings.update', { setting: 'statusPrivacy', value: action.statusPrivacy });
783
+ }
784
+ else if (action?.lockChatAction) {
785
+ ev.emit('chats.lock', { id: id, locked: !!action.lockChatAction.locked });
786
+ }
787
+ else if (action?.privacySettingDisableLinkPreviewsAction) {
788
+ ev.emit('settings.update', {
789
+ setting: 'disableLinkPreviews',
790
+ value: action.privacySettingDisableLinkPreviewsAction
791
+ });
792
+ }
793
+ else if (action?.notificationActivitySettingAction?.notificationActivitySetting) {
794
+ ev.emit('settings.update', {
795
+ setting: 'notificationActivitySetting',
796
+ value: action.notificationActivitySettingAction.notificationActivitySetting
797
+ });
798
+ }
799
+ else if (action?.lidContactAction) {
800
+ ev.emit('contacts.upsert', [
801
+ {
802
+ id: id,
803
+ name: action.lidContactAction.fullName ||
804
+ action.lidContactAction.firstName ||
805
+ action.lidContactAction.username ||
806
+ undefined,
807
+ username: action.lidContactAction.username || undefined,
808
+ lid: id,
809
+ phoneNumber: undefined
810
+ }
811
+ ]);
812
+ }
813
+ else if (action?.privacySettingChannelsPersonalisedRecommendationAction) {
814
+ ev.emit('settings.update', {
815
+ setting: 'channelsPersonalisedRecommendation',
816
+ value: action.privacySettingChannelsPersonalisedRecommendationAction
817
+ });
818
+ }
744
819
  else {
745
820
  logger?.debug({ syncAction, id }, 'unprocessable update');
746
821
  }