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