@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,221 @@
|
|
|
1
|
+
// JAP@Add --- part of the @japofc/baileys utils (anti-delete.ts) (adapted to lib/ CJS-free ESM
|
|
2
|
+
// runtime style used throughout this fork; type-only annotations dropped, behavior unchanged).
|
|
3
|
+
import { proto } from '../../WAProto/index.js';
|
|
4
|
+
// ── MessageStore ───────────────────────────────────────────────────────────
|
|
5
|
+
/**
|
|
6
|
+
* In-memory, TTL-bounded store of recently seen messages, used to recover the
|
|
7
|
+
* original content of a message after WhatsApp delivers a REVOKE (delete-for-everyone)
|
|
8
|
+
* protocol message, which itself carries no content — only a reference key.
|
|
9
|
+
*/
|
|
10
|
+
export class MessageStore {
|
|
11
|
+
store = new Map();
|
|
12
|
+
deletedMessages = new Map();
|
|
13
|
+
cleanupTimer = null;
|
|
14
|
+
options;
|
|
15
|
+
constructor(options = {}) {
|
|
16
|
+
this.options = {
|
|
17
|
+
maxMessagesPerChat: options.maxMessagesPerChat ?? 1000,
|
|
18
|
+
ttl: options.ttl ?? 24 * 60 * 60 * 1000,
|
|
19
|
+
cleanupInterval: options.cleanupInterval ?? 60 * 60 * 1000
|
|
20
|
+
};
|
|
21
|
+
this.startCleanup();
|
|
22
|
+
}
|
|
23
|
+
startCleanup() {
|
|
24
|
+
this.cleanupTimer = setInterval(() => this.cleanup(), this.options.cleanupInterval);
|
|
25
|
+
this.cleanupTimer?.unref?.();
|
|
26
|
+
}
|
|
27
|
+
stopCleanup() {
|
|
28
|
+
if (this.cleanupTimer)
|
|
29
|
+
clearInterval(this.cleanupTimer);
|
|
30
|
+
}
|
|
31
|
+
cleanup() {
|
|
32
|
+
const cutoff = Date.now() - this.options.ttl;
|
|
33
|
+
for (const [chatId, messages] of this.store) {
|
|
34
|
+
for (const [msgId, stored] of messages) {
|
|
35
|
+
if (stored.storedAt < cutoff)
|
|
36
|
+
messages.delete(msgId);
|
|
37
|
+
}
|
|
38
|
+
if (messages.size === 0)
|
|
39
|
+
this.store.delete(chatId);
|
|
40
|
+
}
|
|
41
|
+
for (const [key, info] of this.deletedMessages) {
|
|
42
|
+
if (info.deletedAt < cutoff)
|
|
43
|
+
this.deletedMessages.delete(key);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
getKey(key) {
|
|
47
|
+
return `${key.remoteJid}:${key.id}`;
|
|
48
|
+
}
|
|
49
|
+
storeMessage(message) {
|
|
50
|
+
const chatId = message.key.remoteJid;
|
|
51
|
+
if (!chatId || !message.key.id)
|
|
52
|
+
return;
|
|
53
|
+
let chatMessages = this.store.get(chatId);
|
|
54
|
+
if (!chatMessages) {
|
|
55
|
+
chatMessages = new Map();
|
|
56
|
+
this.store.set(chatId, chatMessages);
|
|
57
|
+
}
|
|
58
|
+
if (chatMessages.size >= this.options.maxMessagesPerChat) {
|
|
59
|
+
const oldestKey = chatMessages.keys().next().value;
|
|
60
|
+
if (oldestKey)
|
|
61
|
+
chatMessages.delete(oldestKey);
|
|
62
|
+
}
|
|
63
|
+
chatMessages.set(message.key.id, { message, storedAt: Date.now(), isDeleted: false });
|
|
64
|
+
}
|
|
65
|
+
storeMessages(messages) {
|
|
66
|
+
for (const msg of messages)
|
|
67
|
+
this.storeMessage(msg);
|
|
68
|
+
}
|
|
69
|
+
getMessage(key) {
|
|
70
|
+
return this.store.get(key.remoteJid)?.get(key.id);
|
|
71
|
+
}
|
|
72
|
+
getOriginalMessage(key) {
|
|
73
|
+
return this.getMessage(key)?.message;
|
|
74
|
+
}
|
|
75
|
+
markAsDeleted(key, deletedBy) {
|
|
76
|
+
const stored = this.getMessage(key);
|
|
77
|
+
if (!stored)
|
|
78
|
+
return null;
|
|
79
|
+
const now = Date.now();
|
|
80
|
+
stored.isDeleted = true;
|
|
81
|
+
stored.deletedAt = now;
|
|
82
|
+
stored.deletedBy = deletedBy;
|
|
83
|
+
// JAP@Fix (bug 66): the old check (`deletedBy === stored.message.key.participant`)
|
|
84
|
+
// only works in groups, where `participant` identifies who sent/revoked a message.
|
|
85
|
+
// In a private chat `key.participant` is always undefined (it's a group-only field),
|
|
86
|
+
// while `deletedBy` there falls back to `remoteJid` — so the comparison could never
|
|
87
|
+
// match and isRevokedBySender was always false for every DM, even though
|
|
88
|
+
// delete-for-everyone in a DM can only be done by the original sender. Treat a
|
|
89
|
+
// missing `participant` (i.e. not a group message) as "revoked by sender" by definition.
|
|
90
|
+
const isGroupMessage = !!stored.message.key.participant;
|
|
91
|
+
const info = {
|
|
92
|
+
originalMessage: stored.message,
|
|
93
|
+
key,
|
|
94
|
+
deletedAt: now,
|
|
95
|
+
deletedBy,
|
|
96
|
+
isRevokedBySender: !deletedBy || !isGroupMessage || deletedBy === stored.message.key.participant
|
|
97
|
+
};
|
|
98
|
+
this.deletedMessages.set(this.getKey(key), info);
|
|
99
|
+
return info;
|
|
100
|
+
}
|
|
101
|
+
getDeletedMessage(key) {
|
|
102
|
+
return this.deletedMessages.get(this.getKey(key));
|
|
103
|
+
}
|
|
104
|
+
getAllDeletedMessages() {
|
|
105
|
+
return Array.from(this.deletedMessages.values());
|
|
106
|
+
}
|
|
107
|
+
getDeletedMessagesByChat(chatId) {
|
|
108
|
+
return Array.from(this.deletedMessages.values()).filter((i) => i.key.remoteJid === chatId);
|
|
109
|
+
}
|
|
110
|
+
getChatMessages(chatId) {
|
|
111
|
+
return Array.from(this.store.get(chatId)?.values() ?? []).map((s) => s.message);
|
|
112
|
+
}
|
|
113
|
+
getChatIds() {
|
|
114
|
+
return Array.from(this.store.keys());
|
|
115
|
+
}
|
|
116
|
+
getStats() {
|
|
117
|
+
let totalMessages = 0;
|
|
118
|
+
for (const messages of this.store.values())
|
|
119
|
+
totalMessages += messages.size;
|
|
120
|
+
return { totalChats: this.store.size, totalMessages, totalDeleted: this.deletedMessages.size };
|
|
121
|
+
}
|
|
122
|
+
clear() {
|
|
123
|
+
this.store.clear();
|
|
124
|
+
this.deletedMessages.clear();
|
|
125
|
+
}
|
|
126
|
+
clearChat(chatId) {
|
|
127
|
+
this.store.delete(chatId);
|
|
128
|
+
}
|
|
129
|
+
getAllMessages() {
|
|
130
|
+
const all = {};
|
|
131
|
+
for (const [chatId, messages] of this.store) {
|
|
132
|
+
all[chatId] = Array.from(messages.values()).map((s) => s.message);
|
|
133
|
+
}
|
|
134
|
+
return all;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// ── Helpers ────────────────────────────────────────────────────────────────
|
|
138
|
+
export const isDeleteMessage = (message) => {
|
|
139
|
+
return message.message?.protocolMessage?.type === proto.Message.ProtocolMessage.Type.REVOKE;
|
|
140
|
+
};
|
|
141
|
+
export const getDeletedMessageKey = (message) => {
|
|
142
|
+
const protoMsg = message.message?.protocolMessage;
|
|
143
|
+
if (protoMsg?.type !== proto.Message.ProtocolMessage.Type.REVOKE)
|
|
144
|
+
return null;
|
|
145
|
+
return protoMsg.key ?? null;
|
|
146
|
+
};
|
|
147
|
+
/**
|
|
148
|
+
* Wire this into `sock.ev.on('messages.update', ...)`. Fires `onDelete` for
|
|
149
|
+
* every update in the batch whose stub type is REVOKE, using `store` to look
|
|
150
|
+
* up the original content that WhatsApp's own update payload omits.
|
|
151
|
+
*/
|
|
152
|
+
export const createAntiDeleteHandler = (store, onDelete) => {
|
|
153
|
+
return (updates) => {
|
|
154
|
+
const deletedMessages = [];
|
|
155
|
+
for (const { key, update } of updates) {
|
|
156
|
+
if (update.messageStubType === proto.WebMessageInfo.StubType.REVOKE) {
|
|
157
|
+
const info = store.markAsDeleted(key, update.messageStubParameters?.[0]);
|
|
158
|
+
if (info) {
|
|
159
|
+
deletedMessages.push(info);
|
|
160
|
+
onDelete?.(info);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return deletedMessages;
|
|
165
|
+
};
|
|
166
|
+
};
|
|
167
|
+
/**
|
|
168
|
+
* JAP@Fix (bug 58): `createAntiDeleteHandler` above only listens on
|
|
169
|
+
* `messages.update` with `messageStubType === REVOKE`. In practice, most
|
|
170
|
+
* delete-for-everyone events actually arrive as a *new* message on
|
|
171
|
+
* `messages.upsert` carrying a `protocolMessage` of type REVOKE (the
|
|
172
|
+
* `isDeleteMessage`/`getDeletedMessageKey` helpers above existed for this but
|
|
173
|
+
* were never wired to anything). Wire this into `sock.ev.on('messages.upsert', ...)`
|
|
174
|
+
* alongside `createMessageStoreHandler` to actually catch those.
|
|
175
|
+
*/
|
|
176
|
+
export const createAntiDeleteUpsertHandler = (store, onDelete) => {
|
|
177
|
+
return ({ messages }) => {
|
|
178
|
+
const deletedMessages = [];
|
|
179
|
+
for (const message of messages) {
|
|
180
|
+
if (!isDeleteMessage(message))
|
|
181
|
+
continue;
|
|
182
|
+
const key = getDeletedMessageKey(message);
|
|
183
|
+
if (!key)
|
|
184
|
+
continue;
|
|
185
|
+
const deletedBy = message.key.participant || message.key.remoteJid;
|
|
186
|
+
const info = store.markAsDeleted(key, deletedBy);
|
|
187
|
+
if (info) {
|
|
188
|
+
deletedMessages.push(info);
|
|
189
|
+
onDelete?.(info);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return deletedMessages;
|
|
193
|
+
};
|
|
194
|
+
};
|
|
195
|
+
/**
|
|
196
|
+
* Wire this into `sock.ev.on('messages.upsert', ...)` to keep `store` populated.
|
|
197
|
+
* Skips protocol/sender-key-distribution messages, which carry no user content.
|
|
198
|
+
*/
|
|
199
|
+
export const createMessageStoreHandler = (store) => {
|
|
200
|
+
return ({ messages }) => {
|
|
201
|
+
const regular = messages.filter((msg) => {
|
|
202
|
+
const c = msg.message;
|
|
203
|
+
if (!c)
|
|
204
|
+
return false;
|
|
205
|
+
if (c.protocolMessage)
|
|
206
|
+
return false;
|
|
207
|
+
if (c.senderKeyDistributionMessage)
|
|
208
|
+
return false;
|
|
209
|
+
return true;
|
|
210
|
+
});
|
|
211
|
+
store.storeMessages(regular);
|
|
212
|
+
};
|
|
213
|
+
};
|
|
214
|
+
export default {
|
|
215
|
+
MessageStore,
|
|
216
|
+
isDeleteMessage,
|
|
217
|
+
getDeletedMessageKey,
|
|
218
|
+
createAntiDeleteHandler,
|
|
219
|
+
createAntiDeleteUpsertHandler,
|
|
220
|
+
createMessageStoreHandler
|
|
221
|
+
};
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type { AuthenticationState, SignalDataTypeMap } from '../Types/Auth.js';
|
|
2
|
+
import type { Logger } from 'pino';
|
|
3
|
+
|
|
4
|
+
export declare const ENC_MAGIC: string;
|
|
5
|
+
export declare const BACKUP_MAGIC: string;
|
|
6
|
+
|
|
7
|
+
export declare function deriveKey(password: string, salt: Buffer): Buffer;
|
|
8
|
+
export declare function encryptJSON(value: any, password: string): string;
|
|
9
|
+
export declare function decryptJSON(payload: string, password: string): any;
|
|
10
|
+
export declare function isEncryptedPayload(value: unknown): boolean;
|
|
11
|
+
|
|
12
|
+
export declare function useEncryptedFileAuthState(folder: string, opts: {
|
|
13
|
+
password: string;
|
|
14
|
+
logger?: Logger;
|
|
15
|
+
}): Promise<{ state: AuthenticationState; saveCreds: () => Promise<void>; clearState: () => Promise<void> }>;
|
|
16
|
+
|
|
17
|
+
export declare function useEncryptedSingleFileAuthState(file: string, opts: {
|
|
18
|
+
password: string;
|
|
19
|
+
logger?: Logger;
|
|
20
|
+
}): Promise<{
|
|
21
|
+
state: AuthenticationState;
|
|
22
|
+
saveCreds: () => Promise<void>;
|
|
23
|
+
flush: () => Promise<void>;
|
|
24
|
+
clearState: () => Promise<void>;
|
|
25
|
+
}>;
|
|
26
|
+
|
|
27
|
+
export declare function backupAuthState(src: string, outFile: string, opts: { password: string }): Promise<{
|
|
28
|
+
outFile: string; files: number; createdAt: string;
|
|
29
|
+
}>;
|
|
30
|
+
|
|
31
|
+
export declare function restoreAuthState(backupFile: string, dest: string, opts: {
|
|
32
|
+
password: string; single?: boolean;
|
|
33
|
+
}): Promise<{ dest: string; files: number; createdAt: string }>;
|
|
34
|
+
|
|
35
|
+
export declare function writeAuthIntegrity(folder: string, opts?: { secret?: string }): Promise<{
|
|
36
|
+
createdAt: string; hmac: boolean; sums: Record<string, string>;
|
|
37
|
+
}>;
|
|
38
|
+
|
|
39
|
+
export declare function verifyAuthIntegrity(folder: string, opts?: { secret?: string }): Promise<{
|
|
40
|
+
ok: boolean; error?: string; mismatched: string[]; missing: string[]; extra: string[];
|
|
41
|
+
}>;
|
|
42
|
+
|
|
43
|
+
export declare function repairAuthState(folder: string, opts?: {
|
|
44
|
+
password?: string; backupFile?: string; backupPassword?: string; logger?: Logger;
|
|
45
|
+
}): Promise<{
|
|
46
|
+
ok: boolean; checked: number; quarantined: string[]; credsRestored: boolean; error?: string;
|
|
47
|
+
}>;
|
|
48
|
+
|
|
49
|
+
export interface RateLimitResult {
|
|
50
|
+
allowed: boolean;
|
|
51
|
+
retryAfterMs: number;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export declare function createRateLimiter(opts?: {
|
|
55
|
+
max?: number; windowMs?: number; minIntervalMs?: number; now?: () => number;
|
|
56
|
+
}): {
|
|
57
|
+
stats: { allowed: number; blocked: number };
|
|
58
|
+
check: (key?: string) => RateLimitResult;
|
|
59
|
+
reset: (key?: string) => void;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
export declare function withPairingGuard(sock: any, opts?: {
|
|
63
|
+
maxPerHour?: number; globalMaxPerHour?: number; minIntervalMs?: number;
|
|
64
|
+
logger?: Logger; now?: () => number;
|
|
65
|
+
}): {
|
|
66
|
+
restore: () => void;
|
|
67
|
+
limiter: ReturnType<typeof createRateLimiter>;
|
|
68
|
+
global: ReturnType<typeof createRateLimiter>;
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
export declare function createQRGuard(opts?: {
|
|
72
|
+
ttlMs?: number; now?: () => number;
|
|
73
|
+
onFirst?: (qr: string) => void; onBlocked?: (count: number) => void;
|
|
74
|
+
}): {
|
|
75
|
+
stats: { passed: number; blocked: number };
|
|
76
|
+
handle: (qr: string | null | undefined) => string | null;
|
|
77
|
+
reset: () => void;
|
|
78
|
+
readonly active: boolean;
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
export declare function redactSecrets<T>(value: T, opts?: { extraKeys?: string[]; maxDepth?: number }): T;
|
|
82
|
+
export declare function secureLogger(base: Logger, opts?: { extraKeys?: string[] }): Logger;
|
|
83
|
+
|
|
84
|
+
export declare function secureLogout(sock: any, opts?: {
|
|
85
|
+
authFolder?: string; authFile?: string; passes?: number; logger?: Logger;
|
|
86
|
+
}): Promise<{ loggedOut: boolean; wiped: string[]; credsScrubbed: boolean }>;
|