@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.
- package/README.md +349 -1171
- package/WAProto/fix-imports.js +74 -18
- package/WAProto/index.js +201 -160
- package/engine-requirements.js +7 -7
- package/lib/Defaults/index.d.ts +19 -0
- package/lib/Defaults/index.d.ts.map +1 -1
- package/lib/Defaults/index.js +32 -6
- package/lib/Defaults/index.js.map +1 -1
- package/lib/Signal/libsignal.d.ts.map +1 -1
- package/lib/Signal/libsignal.js +61 -2
- package/lib/Signal/libsignal.js.map +1 -1
- package/lib/Signal/lid-mapping.d.ts +5 -9
- package/lib/Signal/lid-mapping.d.ts.map +1 -1
- package/lib/Signal/lid-mapping.js +170 -70
- package/lib/Signal/lid-mapping.js.map +1 -1
- package/lib/Socket/Client/websocket.d.ts +1 -1
- package/lib/Socket/Client/websocket.d.ts.map +1 -1
- package/lib/Socket/Client/websocket.js +5 -1
- package/lib/Socket/Client/websocket.js.map +1 -1
- package/lib/Socket/business.d.ts +125 -5
- package/lib/Socket/business.d.ts.map +1 -1
- package/lib/Socket/business.js +11 -8
- package/lib/Socket/business.js.map +1 -1
- package/lib/Socket/chats.d.ts +22 -3
- package/lib/Socket/chats.d.ts.map +1 -1
- package/lib/Socket/chats.js +277 -58
- package/lib/Socket/chats.js.map +1 -1
- package/lib/Socket/communities.d.ts +125 -5
- package/lib/Socket/communities.d.ts.map +1 -1
- package/lib/Socket/groups.d.ts +19 -3
- package/lib/Socket/groups.d.ts.map +1 -1
- package/lib/Socket/groups.js +7 -1
- package/lib/Socket/groups.js.map +1 -1
- package/lib/Socket/index.d.ts +125 -5
- package/lib/Socket/index.d.ts.map +1 -1
- package/lib/Socket/index.js +0 -6
- package/lib/Socket/index.js.map +1 -1
- package/lib/Socket/messages-recv.d.ts +126 -6
- package/lib/Socket/messages-recv.d.ts.map +1 -1
- package/lib/Socket/messages-recv.js +771 -177
- package/lib/Socket/messages-recv.js.map +1 -1
- package/lib/Socket/messages-send.d.ts +129 -7
- package/lib/Socket/messages-send.d.ts.map +1 -1
- package/lib/Socket/messages-send.js +430 -119
- package/lib/Socket/messages-send.js.map +1 -1
- package/lib/Socket/newsletter.d.ts +20 -5
- package/lib/Socket/newsletter.d.ts.map +1 -1
- package/lib/Socket/newsletter.js +2 -47
- package/lib/Socket/newsletter.js.map +1 -1
- package/lib/Socket/socket.d.ts +3 -1
- package/lib/Socket/socket.d.ts.map +1 -1
- package/lib/Socket/socket.js +151 -29
- package/lib/Socket/socket.js.map +1 -1
- package/lib/Types/Auth.d.ts +2 -0
- package/lib/Types/Auth.d.ts.map +1 -1
- package/lib/Types/Call.d.ts +10 -1
- package/lib/Types/Call.d.ts.map +1 -1
- package/lib/Types/Contact.d.ts +2 -0
- package/lib/Types/Contact.d.ts.map +1 -1
- package/lib/Types/Events.d.ts +60 -6
- package/lib/Types/Events.d.ts.map +1 -1
- package/lib/Types/GroupMetadata.d.ts +4 -0
- package/lib/Types/GroupMetadata.d.ts.map +1 -1
- package/lib/Types/Message.d.ts +530 -16
- package/lib/Types/Message.d.ts.map +1 -1
- package/lib/Types/Message.js.map +1 -1
- package/lib/Types/Newsletter.d.ts +32 -45
- package/lib/Types/Newsletter.d.ts.map +1 -1
- package/lib/Types/Newsletter.js +25 -23
- package/lib/Types/Newsletter.js.map +1 -1
- package/lib/Types/State.d.ts +54 -0
- package/lib/Types/State.d.ts.map +1 -1
- package/lib/Types/State.js +42 -0
- package/lib/Types/State.js.map +1 -1
- package/lib/Types/index.d.ts +9 -0
- package/lib/Types/index.d.ts.map +1 -1
- package/lib/Types/index.js.map +1 -1
- package/lib/Utils/auth-utils.d.ts.map +1 -1
- package/lib/Utils/auth-utils.js +53 -20
- package/lib/Utils/auth-utils.js.map +1 -1
- package/lib/Utils/browser-utils.d.ts +13 -0
- package/lib/Utils/browser-utils.d.ts.map +1 -1
- package/lib/Utils/browser-utils.js +90 -10
- package/lib/Utils/browser-utils.js.map +1 -1
- package/lib/Utils/chat-utils.d.ts +30 -0
- package/lib/Utils/chat-utils.d.ts.map +1 -1
- package/lib/Utils/chat-utils.js +134 -59
- package/lib/Utils/chat-utils.js.map +1 -1
- package/lib/Utils/companion-reg-client-utils.d.ts +17 -0
- package/lib/Utils/companion-reg-client-utils.d.ts.map +1 -0
- package/lib/Utils/companion-reg-client-utils.js +34 -0
- package/lib/Utils/companion-reg-client-utils.js.map +1 -0
- package/lib/Utils/crypto.d.ts +4 -8
- package/lib/Utils/crypto.d.ts.map +1 -1
- package/lib/Utils/crypto.js +2 -26
- package/lib/Utils/crypto.js.map +1 -1
- package/lib/Utils/decode-wa-message.d.ts +12 -0
- package/lib/Utils/decode-wa-message.d.ts.map +1 -1
- package/lib/Utils/decode-wa-message.js +16 -0
- package/lib/Utils/decode-wa-message.js.map +1 -1
- package/lib/Utils/event-buffer.d.ts.map +1 -1
- package/lib/Utils/event-buffer.js +43 -8
- package/lib/Utils/event-buffer.js.map +1 -1
- package/lib/Utils/generics.d.ts +3 -1
- package/lib/Utils/generics.d.ts.map +1 -1
- package/lib/Utils/generics.js +17 -4
- package/lib/Utils/generics.js.map +1 -1
- package/lib/Utils/history.d.ts +8 -3
- package/lib/Utils/history.d.ts.map +1 -1
- package/lib/Utils/history.js +60 -16
- package/lib/Utils/history.js.map +1 -1
- package/lib/Utils/identity-change-handler.d.ts +44 -0
- package/lib/Utils/identity-change-handler.d.ts.map +1 -0
- package/lib/Utils/identity-change-handler.js +50 -0
- package/lib/Utils/identity-change-handler.js.map +1 -0
- package/lib/Utils/index.d.ts +6 -0
- package/lib/Utils/index.d.ts.map +1 -1
- package/lib/Utils/index.js +6 -0
- package/lib/Utils/index.js.map +1 -1
- package/lib/Utils/interactive-message.d.ts +201 -0
- package/lib/Utils/interactive-message.d.ts.map +1 -0
- package/lib/Utils/interactive-message.js +256 -0
- package/lib/Utils/interactive-message.js.map +1 -0
- package/lib/Utils/lt-hash.d.ts +7 -12
- package/lib/Utils/lt-hash.d.ts.map +1 -1
- package/lib/Utils/lt-hash.js +2 -42
- package/lib/Utils/lt-hash.js.map +1 -1
- package/lib/Utils/make-mutex.d.ts +1 -0
- package/lib/Utils/make-mutex.d.ts.map +1 -1
- package/lib/Utils/make-mutex.js +20 -27
- package/lib/Utils/make-mutex.js.map +1 -1
- package/lib/Utils/message-composer.d.ts +5 -0
- package/lib/Utils/message-composer.d.ts.map +1 -0
- package/lib/Utils/message-composer.js +5 -0
- package/lib/Utils/message-composer.js.map +1 -0
- package/lib/Utils/message-retry-manager.d.ts +30 -2
- package/lib/Utils/message-retry-manager.d.ts.map +1 -1
- package/lib/Utils/message-retry-manager.js +58 -5
- package/lib/Utils/message-retry-manager.js.map +1 -1
- package/lib/Utils/messages-media.d.ts +35 -5
- package/lib/Utils/messages-media.d.ts.map +1 -1
- package/lib/Utils/messages-media.js +171 -51
- package/lib/Utils/messages-media.js.map +1 -1
- package/lib/Utils/messages.d.ts +2 -0
- package/lib/Utils/messages.d.ts.map +1 -1
- package/lib/Utils/messages.js +475 -35
- package/lib/Utils/messages.js.map +1 -1
- package/lib/Utils/noise-handler.d.ts +4 -4
- package/lib/Utils/noise-handler.d.ts.map +1 -1
- package/lib/Utils/noise-handler.js +139 -85
- package/lib/Utils/noise-handler.js.map +1 -1
- package/lib/Utils/offline-node-processor.d.ts +17 -0
- package/lib/Utils/offline-node-processor.d.ts.map +1 -0
- package/lib/Utils/offline-node-processor.js +40 -0
- package/lib/Utils/offline-node-processor.js.map +1 -0
- package/lib/Utils/process-message.d.ts.map +1 -1
- package/lib/Utils/process-message.js +115 -16
- package/lib/Utils/process-message.js.map +1 -1
- package/lib/Utils/reporting-utils.d.ts +11 -0
- package/lib/Utils/reporting-utils.d.ts.map +1 -0
- package/lib/Utils/reporting-utils.js +258 -0
- package/lib/Utils/reporting-utils.js.map +1 -0
- package/lib/Utils/stanza-ack.d.ts +11 -0
- package/lib/Utils/stanza-ack.d.ts.map +1 -0
- package/lib/Utils/stanza-ack.js +38 -0
- package/lib/Utils/stanza-ack.js.map +1 -0
- package/lib/Utils/sync-action-utils.d.ts +19 -0
- package/lib/Utils/sync-action-utils.d.ts.map +1 -0
- package/lib/Utils/sync-action-utils.js +49 -0
- package/lib/Utils/sync-action-utils.js.map +1 -0
- package/lib/Utils/tc-token-utils.d.ts +37 -0
- package/lib/Utils/tc-token-utils.d.ts.map +1 -0
- package/lib/Utils/tc-token-utils.js +163 -0
- package/lib/Utils/tc-token-utils.js.map +1 -0
- package/lib/Utils/use-mongo-file-auth-state.d.ts +16 -0
- package/lib/Utils/use-mongo-file-auth-state.d.ts.map +1 -0
- package/lib/Utils/use-mongo-file-auth-state.js +60 -0
- package/lib/Utils/use-mongo-file-auth-state.js.map +1 -0
- package/lib/Utils/use-multi-file-auth-state.js +1 -1
- package/lib/Utils/use-multi-file-auth-state.js.map +1 -1
- package/lib/Utils/use-single-file-auth-state.d.ts.map +1 -1
- package/lib/Utils/use-single-file-auth-state.js.map +1 -1
- package/lib/Utils/validate-connection.d.ts.map +1 -1
- package/lib/Utils/validate-connection.js +11 -1
- package/lib/Utils/validate-connection.js.map +1 -1
- package/lib/WABinary/decode.d.ts.map +1 -1
- package/lib/WABinary/decode.js +24 -0
- package/lib/WABinary/decode.js.map +1 -1
- package/lib/WABinary/encode.js +5 -1
- package/lib/WABinary/encode.js.map +1 -1
- package/lib/WABinary/generic-utils.d.ts +10 -1
- package/lib/WABinary/generic-utils.d.ts.map +1 -1
- package/lib/WABinary/generic-utils.js +42 -8
- package/lib/WABinary/generic-utils.js.map +1 -1
- package/lib/WABinary/jid-utils.js.map +1 -1
- package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts.map +1 -1
- package/lib/WAUSync/Protocols/USyncContactProtocol.js +26 -3
- package/lib/WAUSync/Protocols/USyncContactProtocol.js.map +1 -1
- package/lib/WAUSync/Protocols/USyncUsernameProtocol.d.ts +10 -0
- package/lib/WAUSync/Protocols/USyncUsernameProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +25 -0
- package/lib/WAUSync/Protocols/USyncUsernameProtocol.js.map +1 -0
- package/lib/WAUSync/Protocols/index.d.ts +1 -0
- package/lib/WAUSync/Protocols/index.d.ts.map +1 -1
- package/lib/WAUSync/Protocols/index.js +1 -0
- package/lib/WAUSync/Protocols/index.js.map +1 -1
- package/lib/WAUSync/USyncQuery.d.ts +1 -0
- package/lib/WAUSync/USyncQuery.d.ts.map +1 -1
- package/lib/WAUSync/USyncQuery.js +6 -2
- package/lib/WAUSync/USyncQuery.js.map +1 -1
- package/lib/WAUSync/USyncUser.d.ts +4 -0
- package/lib/WAUSync/USyncUser.d.ts.map +1 -1
- package/lib/WAUSync/USyncUser.js +8 -0
- package/lib/WAUSync/USyncUser.js.map +1 -1
- package/lib/addons/anti-delete.d.ts +72 -0
- package/lib/addons/anti-delete.d.ts.map +1 -0
- package/lib/addons/anti-delete.js +165 -0
- package/lib/addons/anti-delete.js.map +1 -0
- package/lib/addons/auto-reply.d.ts +67 -0
- package/lib/addons/auto-reply.d.ts.map +1 -0
- package/lib/addons/auto-reply.js +145 -0
- package/lib/addons/auto-reply.js.map +1 -0
- package/lib/addons/browser-presets.d.ts +16 -0
- package/lib/addons/browser-presets.d.ts.map +1 -0
- package/lib/addons/browser-presets.js +24 -0
- package/lib/addons/browser-presets.js.map +1 -0
- package/lib/addons/button-sender.d.ts +260 -0
- package/lib/addons/button-sender.d.ts.map +1 -0
- package/lib/addons/button-sender.js +771 -0
- package/lib/addons/button-sender.js.map +1 -0
- package/lib/addons/call-handler.d.ts +79 -0
- package/lib/addons/call-handler.d.ts.map +1 -0
- package/lib/addons/call-handler.js +342 -0
- package/lib/addons/call-handler.js.map +1 -0
- package/lib/addons/from-chats.d.ts +30 -0
- package/lib/addons/from-chats.d.ts.map +1 -0
- package/lib/addons/from-chats.js +38 -0
- package/lib/addons/from-chats.js.map +1 -0
- package/lib/addons/from-messages-recv.d.ts +59 -0
- package/lib/addons/from-messages-recv.d.ts.map +1 -0
- package/lib/addons/from-messages-recv.js +326 -0
- package/lib/addons/from-messages-recv.js.map +1 -0
- package/lib/addons/from-messages-send.d.ts +50 -0
- package/lib/addons/from-messages-send.d.ts.map +1 -0
- package/lib/addons/from-messages-send.js +148 -0
- package/lib/addons/from-messages-send.js.map +1 -0
- package/lib/addons/from-messages.d.ts +52 -0
- package/lib/addons/from-messages.d.ts.map +1 -0
- package/lib/addons/from-messages.js +304 -0
- package/lib/addons/from-messages.js.map +1 -0
- package/lib/addons/index.d.ts +67 -0
- package/lib/addons/index.d.ts.map +1 -0
- package/lib/addons/index.js +86 -0
- package/lib/addons/index.js.map +1 -0
- package/lib/addons/interactive-message.d.ts +201 -0
- package/lib/addons/interactive-message.d.ts.map +1 -0
- package/lib/addons/interactive-message.js +256 -0
- package/lib/addons/interactive-message.js.map +1 -0
- package/lib/addons/jid-plot.d.ts +49 -0
- package/lib/addons/jid-plot.d.ts.map +1 -0
- package/lib/addons/jid-plot.js +84 -0
- package/lib/addons/jid-plot.js.map +1 -0
- package/lib/addons/jid-plotting.d.ts +54 -0
- package/lib/addons/jid-plotting.d.ts.map +1 -0
- package/lib/addons/jid-plotting.js +150 -0
- package/lib/addons/jid-plotting.js.map +1 -0
- package/lib/addons/lid-support.d.ts +41 -0
- package/lib/addons/lid-support.d.ts.map +1 -0
- package/lib/addons/lid-support.js +42 -0
- package/lib/addons/lid-support.js.map +1 -0
- package/lib/addons/message-composer.d.ts +142 -0
- package/lib/addons/message-composer.d.ts.map +1 -0
- package/lib/addons/message-composer.js +377 -0
- package/lib/addons/message-composer.js.map +1 -0
- package/lib/addons/message-scheduler.d.ts +77 -0
- package/lib/addons/message-scheduler.d.ts.map +1 -0
- package/lib/addons/message-scheduler.js +108 -0
- package/lib/addons/message-scheduler.js.map +1 -0
- package/lib/addons/message-search.d.ts +51 -0
- package/lib/addons/message-search.d.ts.map +1 -0
- package/lib/addons/message-search.js +171 -0
- package/lib/addons/message-search.js.map +1 -0
- package/lib/addons/message-utils.d.ts +88 -0
- package/lib/addons/message-utils.d.ts.map +1 -0
- package/lib/addons/message-utils.js +292 -0
- package/lib/addons/message-utils.js.map +1 -0
- package/lib/addons/outgoing-calls.d.ts +64 -0
- package/lib/addons/outgoing-calls.d.ts.map +1 -0
- package/lib/addons/outgoing-calls.js +139 -0
- package/lib/addons/outgoing-calls.js.map +1 -0
- package/lib/addons/pairing-fix.d.ts +31 -0
- package/lib/addons/pairing-fix.d.ts.map +1 -0
- package/lib/addons/pairing-fix.js +74 -0
- package/lib/addons/pairing-fix.js.map +1 -0
- package/lib/addons/past-participants.d.ts +42 -0
- package/lib/addons/past-participants.d.ts.map +1 -0
- package/lib/addons/past-participants.js +41 -0
- package/lib/addons/past-participants.js.map +1 -0
- package/lib/addons/rich-response.d.ts +111 -0
- package/lib/addons/rich-response.d.ts.map +1 -0
- package/lib/addons/rich-response.js +152 -0
- package/lib/addons/rich-response.js.map +1 -0
- package/lib/addons/scheduling.d.ts +41 -0
- package/lib/addons/scheduling.d.ts.map +1 -0
- package/lib/addons/scheduling.js +110 -0
- package/lib/addons/scheduling.js.map +1 -0
- package/lib/addons/status-posting.d.ts +177 -0
- package/lib/addons/status-posting.d.ts.map +1 -0
- package/lib/addons/status-posting.js +240 -0
- package/lib/addons/status-posting.js.map +1 -0
- package/lib/addons/stickerpack.d.ts +37 -0
- package/lib/addons/stickerpack.d.ts.map +1 -0
- package/lib/addons/stickerpack.js +39 -0
- package/lib/addons/stickerpack.js.map +1 -0
- package/lib/addons/templates.d.ts +72 -0
- package/lib/addons/templates.d.ts.map +1 -0
- package/lib/addons/templates.js +145 -0
- package/lib/addons/templates.js.map +1 -0
- package/lib/addons/vcard.d.ts +59 -0
- package/lib/addons/vcard.d.ts.map +1 -0
- package/lib/addons/vcard.js +88 -0
- package/lib/addons/vcard.js.map +1 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- 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;
|
|
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:
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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, '
|
|
18
|
-
macOS: browser => ['Mac OS', browser, '
|
|
19
|
-
baileys: browser => ['Baileys', browser, '
|
|
20
|
-
windows: browser => ['Windows', browser, '
|
|
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 =>
|
|
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
|
-
|
|
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,
|
|
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":"
|
|
1
|
+
{"version":3,"file":"chat-utils.d.ts","sourceRoot":"","sources":["../../src/Utils/chat-utils.ts"],"names":[],"mappings":"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"}
|
package/lib/Utils/chat-utils.js
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
10
|
-
|
|
10
|
+
import { emitSyncActionResults, processContactAction } from './sync-action-utils.js';
|
|
11
|
+
const mutationKeys = (keydata) => {
|
|
12
|
+
const keys = expandAppStateKeys(keydata);
|
|
11
13
|
return {
|
|
12
|
-
indexKey:
|
|
13
|
-
valueEncryptionKey:
|
|
14
|
-
valueMacKey:
|
|
15
|
-
snapshotMacKey:
|
|
16
|
-
patchMacKey:
|
|
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
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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.
|
|
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
|
-
|
|
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(
|
|
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(
|
|
65
|
+
subBuffs.push(prevOp.valueMac);
|
|
67
66
|
}
|
|
68
67
|
},
|
|
69
|
-
finish:
|
|
70
|
-
const
|
|
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:
|
|
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`, {
|
|
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 =
|
|
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,
|
|
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 =
|
|
149
|
-
const encContent = content.
|
|
150
|
-
const ogValueMac = content.
|
|
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
|
|
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
|
-
|
|
180
|
-
data: { msgMutations }
|
|
204
|
+
data: { isMissingKey: true, msgMutations }
|
|
181
205
|
});
|
|
182
206
|
}
|
|
183
|
-
|
|
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`, {
|
|
217
|
+
throw new Boom(`failed to find key "${base64Key}" to decode patch`, { data: { isMissingKey: true, msg } });
|
|
192
218
|
}
|
|
193
|
-
const mainKey =
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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
|
}
|