kage-baileys 3.0.6 → 3.2.3
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/Example/connection.cjs +4 -0
- package/README.MD +4726 -48
- package/WAProto/WAProto.proto +3395 -415
- package/WAProto/compat.cjs +12 -0
- package/WAProto/index.d.ts +47104 -19888
- package/WAProto/index.js +131979 -57361
- package/lib/Addon/http-error.js +43 -0
- package/lib/Addon/index.js +32 -0
- package/lib/Addon/keyed-db.js +250 -0
- package/lib/Addon/link-preview.js +82 -0
- package/lib/Defaults/baileys-version.json +3 -0
- package/lib/Defaults/connection.js +110 -0
- package/lib/Defaults/constants.js +156 -0
- package/lib/Defaults/history.js +46 -0
- package/lib/Defaults/index.js +230 -0
- package/lib/Defaults/media.js +104 -0
- package/lib/Defaults/phonenumber-mcc.json +223 -0
- package/lib/Defaults/prefix.js +44 -0
- package/lib/Extensions/business-advanced.js +382 -0
- package/lib/Extensions/business.js +159 -0
- package/lib/Extensions/chats-advanced.js +1106 -0
- package/lib/Extensions/chats.js +349 -0
- package/lib/Extensions/communities-advanced.js +430 -0
- package/lib/Extensions/community.js +94 -0
- package/lib/Extensions/groups-advanced.js +343 -0
- package/lib/Extensions/index.js +30 -0
- package/lib/Extensions/messages-recv-advanced.js +1690 -0
- package/lib/Extensions/messages-send-advanced.js +622 -0
- package/lib/Extensions/messages-send.js +1380 -0
- package/lib/Extensions/newsletter-advanced.js +228 -0
- package/lib/Extensions/newsletter.js +72 -0
- package/lib/Extensions/socket.js +389 -0
- package/lib/Modded/message_builder.js +2084 -4
- package/lib/Signal/Group/ciphertext-message.js +54 -0
- package/lib/Signal/Group/group-session-builder.js +124 -0
- package/lib/Signal/Group/group_cipher.js +216 -0
- package/lib/Signal/Group/index.js +124 -0
- package/lib/Signal/Group/keyhelper.js +108 -0
- package/lib/Signal/Group/sender-chain-key.js +83 -0
- package/lib/Signal/Group/sender-key-distribution-message.js +157 -0
- package/lib/Signal/Group/sender-key-message.js +166 -0
- package/lib/Signal/Group/sender-key-name.js +130 -0
- package/lib/Signal/Group/sender-key-record.js +113 -0
- package/lib/Signal/Group/sender-key-state.js +208 -0
- package/lib/Signal/Group/sender-message-key.js +82 -0
- package/lib/Signal/libsignal.js +935 -0
- package/lib/Signal/lid-mapping.js +545 -1
- package/lib/Socket/Client/index.js +60 -0
- package/lib/Socket/Client/types.js +51 -0
- package/lib/Socket/Client/websocket.js +152 -0
- package/lib/Socket/business.js +831 -0
- package/lib/Socket/chats.js +2535 -49
- package/lib/Socket/communities.js +450 -1
- package/lib/Socket/community.js +1022 -0
- package/lib/Socket/dugong.js +1 -1
- package/lib/Socket/groups.js +747 -0
- package/lib/Socket/index.js +60 -2
- package/lib/Socket/messages-recv.js +3450 -5
- package/lib/Socket/messages-send.js +3123 -0
- package/lib/Socket/mex.js +126 -1
- package/lib/Socket/newsletter.js +465 -0
- package/lib/Socket/socket.js +2217 -1
- package/lib/Store/index.js +79 -0
- package/lib/Store/make-cache-manager-store.js +186 -0
- package/lib/Store/make-in-memory-store.js +878 -0
- package/lib/Store/make-ordered-dictionary.js +187 -0
- package/lib/Store/object-repository.js +78 -0
- package/lib/Types/Auth.js +25 -0
- package/lib/Types/Bussines.js +25 -1
- package/lib/Types/Call.js +25 -0
- package/lib/Types/Chat.js +39 -0
- package/lib/Types/Contact.js +25 -0
- package/lib/Types/Events.js +25 -0
- package/lib/Types/GroupMetadata.js +25 -0
- package/lib/Types/Label.js +76 -0
- package/lib/Types/LabelAssociation.js +40 -0
- package/lib/Types/Message.js +57 -0
- package/lib/Types/Mex.js +56 -1
- package/lib/Types/MexUpdates.js +46 -0
- package/lib/Types/Newsletter.js +56 -0
- package/lib/Types/Product.js +25 -0
- package/lib/Types/RichType.js +23 -0
- package/lib/Types/Signal.js +25 -0
- package/lib/Types/Socket.js +25 -0
- package/lib/Types/State.js +92 -0
- package/lib/Types/USync.js +25 -0
- package/lib/Types/index.js +133 -0
- package/lib/Utils/auth-utils.js +703 -0
- package/lib/Utils/automation-tools.js +51 -16
- package/lib/Utils/baileys-event-stream.js +146 -0
- package/lib/Utils/browser-utils.js +95 -0
- package/lib/Utils/business.js +525 -0
- package/lib/Utils/chat-utils.js +1861 -0
- package/lib/Utils/companion-reg-client-utils.js +55 -1
- package/lib/Utils/crypto.js +355 -0
- package/lib/Utils/decode-wa-message.js +709 -0
- package/lib/Utils/event-buffer.js +1323 -8
- package/lib/Utils/generics.js +945 -1
- package/lib/Utils/history.js +266 -0
- package/lib/Utils/identity-change-handler.js +62 -1
- package/lib/Utils/index.js +114 -0
- package/lib/Utils/link-preview.js +179 -0
- package/lib/Utils/logger.js +42 -0
- package/lib/Utils/lt-hash.js +73 -0
- package/lib/Utils/make-mutex.js +104 -0
- package/lib/Utils/message-inspector.js +110 -0
- package/lib/Utils/message-retry-manager.js +507 -2
- package/lib/Utils/messages-media.js +1931 -1
- package/lib/Utils/messages.js +3748 -0
- package/lib/Utils/noise-handler.js +423 -0
- package/lib/Utils/offline-node-processor.js +53 -1
- package/lib/Utils/pre-key-manager.js +255 -1
- package/lib/Utils/process-message.js +1592 -0
- package/lib/Utils/reporting-utils.js +272 -1
- package/lib/Utils/rich-message-utils.js +377 -0
- package/lib/Utils/rich-messages.js +1 -1
- package/lib/Utils/signal.js +437 -0
- package/lib/Utils/stanza-ack.js +51 -1
- package/lib/Utils/status-refresh.js +37 -0
- package/lib/Utils/status-tools.js +4 -2
- package/lib/Utils/sync-action-utils.js +63 -1
- package/lib/Utils/tc-token-utils.js +185 -1
- package/lib/Utils/terminal-banner.js +31 -0
- package/lib/Utils/use-multi-file-auth-state.js +271 -0
- package/lib/Utils/use-single-file-auth-state.js +108 -0
- package/lib/Utils/use-sqlite-auth-state.js +142 -0
- package/lib/Utils/validate-connection.js +497 -1
- package/lib/Utils/view-once-compat.js +13 -5
- package/lib/VoIP/audio-feeder.js +150 -0
- package/lib/VoIP/index.js +289 -0
- package/lib/VoIP/relay-transport.js +608 -0
- package/lib/VoIP/signaling.js +583 -0
- package/lib/VoIP/types.js +30 -0
- package/lib/VoIP/wasm-engine.js +1261 -2
- package/lib/VoIP/worker-bootstrap.js +1090 -2
- package/lib/WABinary/constants.js +2805 -0
- package/lib/WABinary/decode.js +649 -2
- package/lib/WABinary/encode.js +564 -2
- package/lib/WABinary/generic-utils.js +401 -0
- package/lib/WABinary/index.js +82 -0
- package/lib/WABinary/jid-utils.js +290 -0
- package/lib/WABinary/types.js +25 -0
- package/lib/WAM/BinaryInfo.js +50 -0
- package/lib/WAM/constants.js +45747 -0
- package/lib/WAM/encode.js +393 -0
- package/lib/WAM/index.js +78 -0
- package/lib/WAUSync/Protocols/USyncBotProfileProtocol.js +135 -0
- package/lib/WAUSync/Protocols/USyncContactProtocol.js +110 -0
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +142 -0
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +85 -0
- package/lib/WAUSync/Protocols/USyncLIDProtocol.js +69 -0
- package/lib/WAUSync/Protocols/USyncStatusProtocol.js +107 -0
- package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +38 -1
- package/lib/WAUSync/Protocols/index.js +83 -0
- package/lib/WAUSync/USyncQuery.js +241 -2
- package/lib/WAUSync/USyncUser.js +86 -0
- package/lib/WAUSync/index.js +78 -0
- package/lib/assets/wasm/loader.js +1875 -1
- package/lib/assets/wasm/worker-modules.js +11047 -1
- package/lib/index.d.ts +126 -0
- package/lib/index.js +53 -21
- package/lib/index.mjs +437 -0
- package/licenses/upstream-MIT.txt +22 -0
- package/maintenance/api-coverage.json +1642 -0
- package/maintenance/archivos-sha256.json +207 -0
- package/maintenance/consumer-validation.log +3 -0
- package/maintenance/dependency-audit.json +4 -4
- package/maintenance/extension-inventory.json +57 -0
- package/maintenance/protocol-update.json +1101 -0
- package/maintenance/protocol-wire-audit.json +4 -0
- package/maintenance/reference-socket-surface.json +209 -0
- package/maintenance/resumen-validacion.json +50 -0
- package/maintenance/validation.log +2725 -0
- package/maintenance/verification.json +566 -0
- package/package.json +107 -9
- package/scripts/check-imports.cjs +10 -0
- package/scripts/check-package.cjs +40 -0
- package/scripts/check-syntax.cjs +1 -1
- package/scripts/generate-protobuf.cjs +6 -1
- package/scripts/generate-public-types.cjs +9 -0
- package/scripts/kage-base64-fix.cjs +45 -0
- package/scripts/maintenance.cjs +10 -0
- package/test/advanced.test.cjs +24 -0
- package/test/base64-fix.test.cjs +49 -0
- package/test/maintenance.test.cjs +1 -1
- package/test/npm-publication.test.cjs +141 -0
- package/test/recepcion-reparada.test.cjs +98 -0
- package/test/resilience-binary.test.cjs +69 -0
- package/test/resilience-transport.test.cjs +34 -0
- package/test/types.test.ts +5 -0
- package/test/upgrade.test.cjs +104 -0
- package/tsconfig.json +20 -0
- package/WAProto/p.html +0 -1
- package/lib/KageExtra/Modded/message_builder.js +0 -2330
- package/lib/KageExtra/VoIP/audio-feeder.js +0 -136
- package/lib/KageExtra/VoIP/index.js +0 -282
- package/lib/KageExtra/VoIP/relay-transport.js +0 -559
- package/lib/KageExtra/VoIP/signaling.js +0 -603
- package/lib/KageExtra/VoIP/types.js +0 -17
- package/lib/KageExtra/VoIP/wasm-engine.js +0 -1214
- package/lib/KageExtra/VoIP/worker-bootstrap.js +0 -1042
- package/lib/KageExtra/assets/wasm/loader.js +0 -5
- package/lib/KageExtra/assets/wasm/whatsapp.wasm +0 -0
- package/lib/KageExtra/assets/wasm/worker-modules.js +0 -273
- package/lib/KageExtra/index.js +0 -3
- package/lib/KageExtra/package.json +0 -1
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +0 -53
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +0 -24
- package/maintenance/revision-full-check.txt +0 -1097
- package/maintenance/revision-library-tests.tap +0 -1088
- package/maintenance/revision-protobuf.txt +0 -5
- package/maintenance/revision-syntax.txt +0 -5
- package/maintenance/schema-coverage.json +0 -23
- package/maintenance/schema-merge.json +0 -30
- package/maintenance/validation-node20.txt +0 -191
- package/maintenance/validation-node22.txt +0 -237
|
@@ -8,7 +8,7 @@ function unwrapNormalMedia(raw) {
|
|
|
8
8
|
let msg = raw?.message;
|
|
9
9
|
for (let i = 0; i < 12 && msg; i++) {
|
|
10
10
|
if (msg.viewOnceMessage || msg.viewOnceMessageV2 || msg.viewOnceMessageV2Extension) throw new Error('VIEW_ONCE_PROTECTED: pide al remitente una copia normal con su consentimiento.');
|
|
11
|
-
const wrapper = ['ephemeralMessage', 'documentWithCaptionMessage'].find(k => msg[k]?.message);
|
|
11
|
+
const wrapper = ['deviceSentMessage', 'ephemeralMessage', 'documentWithCaptionMessage'].find(k => msg[k]?.message);
|
|
12
12
|
if (wrapper) { msg = msg[wrapper].message; continue; }
|
|
13
13
|
for (const type of ['imageMessage', 'videoMessage', 'audioMessage', 'documentMessage', 'stickerMessage']) {
|
|
14
14
|
if (!msg[type]) continue;
|
|
@@ -33,16 +33,32 @@ async function downloadNormalMedia(conn, raw, options = {}) {
|
|
|
33
33
|
const chunks = [];
|
|
34
34
|
let size = 0;
|
|
35
35
|
const job = (async () => {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
36
|
+
let target = { ...raw, message: media.message };
|
|
37
|
+
for (let attempt = 0; attempt < 2; attempt++) {
|
|
38
|
+
chunks.length = 0; size = 0;
|
|
39
|
+
try {
|
|
40
|
+
stream = await download(target, 'stream', { options: { timeout: timeoutMs } }, { logger, reuploadRequest: conn.updateMediaMessage?.bind(conn) });
|
|
41
|
+
if (stopped) { stream.destroy?.(); throw new Error('MEDIA_TIMEOUT'); }
|
|
42
|
+
for await (const chunk of stream) {
|
|
43
|
+
if (stopped) throw new Error('MEDIA_TIMEOUT');
|
|
44
|
+
const data = Buffer.from(chunk); size += data.length;
|
|
45
|
+
if (size > maxBytes) throw new Error('MEDIA_TOO_LARGE: se interrumpió al alcanzar el límite.');
|
|
46
|
+
chunks.push(data);
|
|
47
|
+
}
|
|
48
|
+
if (!size) throw new Error('EMPTY_MEDIA: WhatsApp no entregó datos.');
|
|
49
|
+
return { buffer: Buffer.concat(chunks, size), type: media.type, mimetype: media.value.mimetype || 'application/octet-stream', caption: media.value.caption || '', bytes: size };
|
|
50
|
+
} catch (error) {
|
|
51
|
+
stream?.destroy?.();
|
|
52
|
+
const code = error?.output?.statusCode || error?.response?.status || error?.statusCode;
|
|
53
|
+
const retry = [403,404,408,410,429,500,502,503,504].includes(Number(code)) || /EMPTY_MEDIA|ECONNRESET|ETIMEDOUT|ENOTFOUND/.test(error?.message || error?.code || '');
|
|
54
|
+
if (attempt || stopped || !retry) throw error;
|
|
55
|
+
if ([403,404,410].includes(Number(code)) && typeof conn.updateMediaMessage === 'function') {
|
|
56
|
+
const updated = await conn.updateMediaMessage(target);
|
|
57
|
+
if (updated?.message) target = updated;
|
|
58
|
+
}
|
|
59
|
+
if (stopped) throw new Error('MEDIA_TIMEOUT');
|
|
60
|
+
}
|
|
43
61
|
}
|
|
44
|
-
if (!size) throw new Error('EMPTY_MEDIA: WhatsApp no entregó datos.');
|
|
45
|
-
return { buffer: Buffer.concat(chunks, size), type: media.type, mimetype: media.value.mimetype || 'application/octet-stream', caption: media.value.caption || '', bytes: size };
|
|
46
62
|
})();
|
|
47
63
|
try {
|
|
48
64
|
return await Promise.race([job, new Promise((_, reject) => { timer = setTimeout(() => reject(new Error('MEDIA_TIMEOUT: tiempo de espera agotado.')), timeoutMs); })]);
|
|
@@ -96,7 +112,7 @@ function handleAutoMedia(raw, conn, settings = {}, options = {}) {
|
|
|
96
112
|
while (state.seen.size > 500) state.seen.delete(state.seen.keys().next().value);
|
|
97
113
|
state.pending++;
|
|
98
114
|
const job = state.tail.then(() => saveNormalMedia(conn, raw, options));
|
|
99
|
-
state.tail = job.catch(() => {}).finally(() => { state.pending--; });
|
|
115
|
+
state.tail = job.catch(() => { state.seen.delete(id); }).finally(() => { state.pending--; });
|
|
100
116
|
return job;
|
|
101
117
|
}
|
|
102
118
|
async function sendAIResponse(conn, jid, text, options = {}) {
|
|
@@ -113,6 +129,12 @@ function installKageTools(conn, options = {}) {
|
|
|
113
129
|
Object.defineProperty(conn, '__kageToolsInstalled', { value: true });
|
|
114
130
|
const status = require('./status-tools');
|
|
115
131
|
const country = require('./country-info');
|
|
132
|
+
conn.inspectMessage = raw => require('./message-inspector').inspectMessage(raw);
|
|
133
|
+
conn.getMessageDiagnostics = () => require('./message-inspector').getMessageDiagnostics(conn);
|
|
134
|
+
conn.enableEventTracking = opts => require('./message-inspector').installMessageInspector(conn, opts);
|
|
135
|
+
conn.refreshReceivedStatuses = opts => require('./status-refresh').refreshReceivedStatuses(conn, opts);
|
|
136
|
+
if (options.eventTracking) conn.enableEventTracking(options.eventOptions || {});
|
|
137
|
+
if (options.banner) require('./terminal-banner').showKageBanner();
|
|
116
138
|
conn.getReceivedStatuses = (includeUnavailable = false) => status.listStatuses(conn, includeUnavailable);
|
|
117
139
|
conn.getCountryForJid = jid => country.getCountryForJid(conn, jid);
|
|
118
140
|
conn.downloadNormalMedia = (raw, opts) => downloadNormalMedia(conn, raw, opts);
|
|
@@ -129,17 +151,25 @@ function installKageTools(conn, options = {}) {
|
|
|
129
151
|
conn.enableMediaAutomation = (settings = {}) => {
|
|
130
152
|
if (conn.__kageStopMedia) return conn.__kageStopMedia;
|
|
131
153
|
let active = true;
|
|
154
|
+
const recent = new Map();
|
|
132
155
|
const scoped = new Proxy(settings, { get(target, key) { return !active && ['autoDownloadChats','autoViewOnceChats','autoViewOnceConsent'].includes(key) ? undefined : target[key]; } });
|
|
133
156
|
const upsert = event => {
|
|
134
|
-
if (event?.type
|
|
157
|
+
if (event?.type && !['notify', 'append'].includes(event.type)) return;
|
|
135
158
|
for (const raw of event.messages || []) {
|
|
159
|
+
const id = JSON.stringify([raw.key?.remoteJid, raw.key?.id]);
|
|
160
|
+
if (raw.messageTimestamp) recent.set(id, raw.messageTimestamp);
|
|
161
|
+
while(recent.size > 1000) recent.delete(recent.keys().next().value);
|
|
136
162
|
handleAutoMedia(raw, conn, scoped).catch(error => conn.logger?.warn?.({ error: error.message }, 'media automation'));
|
|
137
163
|
require('./view-once-compat').handleAutoViewOnce(raw, conn, scoped).catch(error => conn.logger?.warn?.({ error: error.message }, 'view once automation'));
|
|
138
164
|
}
|
|
139
165
|
};
|
|
140
|
-
const
|
|
166
|
+
const updated = items => { for (const item of items || []) if (item.update?.message) {
|
|
167
|
+
const timestamp = item.update.messageTimestamp || recent.get(JSON.stringify([item.key?.remoteJid, item.key?.id]));
|
|
168
|
+
if (timestamp) upsert({ type: 'append', messages: [{ ...item.update, key: item.key, messageTimestamp: timestamp }] });
|
|
169
|
+
} };
|
|
170
|
+
const stop = () => { active = false; recent.clear(); conn.ev.off('messages.update', updated); conn.ev.off('messages.upsert', upsert); conn.ev.off('connection.update', closed); delete conn.__kageStopMedia; };
|
|
141
171
|
const closed = update => { if (update.connection === 'close') stop(); };
|
|
142
|
-
conn.ev.on('messages.upsert', upsert); conn.ev.on('connection.update', closed);
|
|
172
|
+
conn.ev.on('messages.upsert', upsert); conn.ev.on('messages.update', updated); conn.ev.on('connection.update', closed);
|
|
143
173
|
conn.__kageStopMedia = stop;
|
|
144
174
|
return stop;
|
|
145
175
|
};
|
|
@@ -151,11 +181,16 @@ function installKageTools(conn, options = {}) {
|
|
|
151
181
|
let active = true;
|
|
152
182
|
const scopedSettings = new Proxy(settings, { get(target, key) { return key === 'statusSave' ? active && target[key] : target[key]; } });
|
|
153
183
|
const upsert = event => { for (const raw of event?.messages || []) status.handleStatus(raw, conn, scopedSettings).catch(e => conn.logger?.warn?.({ error: e.message }, 'status tracking')); };
|
|
184
|
+
const history = event => upsert(event);
|
|
154
185
|
const deleted = event => { for (const key of event?.keys || []) status.markStatusDeleted(conn, key); };
|
|
155
|
-
const updated = items => { for (const item of items || [])
|
|
186
|
+
const updated = items => { for (const item of items || []) {
|
|
187
|
+
if (item.key?.remoteJid === 'status@broadcast' && item.update?.message === null) status.markStatusDeleted(conn, item.key);
|
|
188
|
+
else if (item.update?.message) upsert({ messages: [{ ...item.update, key: item.key }] });
|
|
189
|
+
} };
|
|
156
190
|
const closed = update => { if (update.connection === 'close') stop?.(); };
|
|
157
191
|
const timer = setInterval(() => status.flushStatuses(conn), 60000); timer.unref?.();
|
|
158
192
|
conn.ev.on('messages.upsert', upsert);
|
|
193
|
+
conn.ev.on('messaging-history.set', history);
|
|
159
194
|
conn.ev.on('messages.delete', deleted);
|
|
160
195
|
conn.ev.on('messages.update', updated);
|
|
161
196
|
conn.ev.on('connection.update', closed);
|
|
@@ -163,7 +198,7 @@ function installKageTools(conn, options = {}) {
|
|
|
163
198
|
if (!active) return;
|
|
164
199
|
active = false;
|
|
165
200
|
clearInterval(timer);
|
|
166
|
-
conn.ev.off('messages.upsert', upsert); conn.ev.off('messages.delete', deleted);
|
|
201
|
+
conn.ev.off('messages.upsert', upsert); conn.ev.off('messaging-history.set', history); conn.ev.off('messages.delete', deleted);
|
|
167
202
|
conn.ev.off('messages.update', updated); conn.ev.off('connection.update', closed);
|
|
168
203
|
status.flushStatuses(conn); stop = undefined;
|
|
169
204
|
};
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"use strict"
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true })
|
|
4
|
+
|
|
5
|
+
const Events = require("events")
|
|
6
|
+
const {
|
|
7
|
+
promises,
|
|
8
|
+
createReadStream
|
|
9
|
+
} = require("fs")
|
|
10
|
+
const { writeFile } = require("fs/promises")
|
|
11
|
+
const { createInterface } = require("readline")
|
|
12
|
+
const { delay } = require("./generics")
|
|
13
|
+
const { makeMutex } = require("./make-mutex")
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Captures events from a baileys event emitter & stores them in a file
|
|
17
|
+
* @param ev The event emitter to read events from
|
|
18
|
+
* @param filename File to save to
|
|
19
|
+
*/
|
|
20
|
+
const captureEventStream = (ev, filename) => {
|
|
21
|
+
const oldEmit = ev.emit
|
|
22
|
+
// write mutex so data is appended in order
|
|
23
|
+
const writeMutex = makeMutex()
|
|
24
|
+
// monkey patch eventemitter to capture all events
|
|
25
|
+
ev.emit = function (...args) {
|
|
26
|
+
const content = JSON.stringify({ timestamp: Date.now(), event: args[0], data: args[1] }) + '\n'
|
|
27
|
+
const result = oldEmit.apply(ev, args)
|
|
28
|
+
writeMutex.mutex(async () => {
|
|
29
|
+
await promises.writeFile(filename, content, { flag: 'a' })
|
|
30
|
+
})
|
|
31
|
+
return result
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Read event file and emit events from there
|
|
37
|
+
* @param filename filename containing event data
|
|
38
|
+
* @param delayIntervalMs delay between each event emit
|
|
39
|
+
*/
|
|
40
|
+
const readAndEmitEventStream = (filename, delayIntervalMs = 0) => {
|
|
41
|
+
const ev = new Events()
|
|
42
|
+
const fireEvents = async () => {
|
|
43
|
+
// from: https://stackoverflow.com/questions/6156501/read-a-file-one-line-at-a-time-in-node-js
|
|
44
|
+
const fileStream = createReadStream(filename)
|
|
45
|
+
const rl = createInterface({
|
|
46
|
+
input: fileStream,
|
|
47
|
+
crlfDelay: Infinity
|
|
48
|
+
})
|
|
49
|
+
// Note: we use the crlfDelay option to recognize all instances of CR LF
|
|
50
|
+
// ('\r\n') in input.txt as a single line break.
|
|
51
|
+
for await (const line of rl) {
|
|
52
|
+
if (line) {
|
|
53
|
+
const { event, data } = JSON.parse(line)
|
|
54
|
+
ev.emit(event, data)
|
|
55
|
+
delayIntervalMs && await delay(delayIntervalMs)
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
fileStream.close()
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
ev,
|
|
62
|
+
task: fireEvents()
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
module.exports = {
|
|
67
|
+
captureEventStream,
|
|
68
|
+
readAndEmitEventStream
|
|
69
|
+
}
|
|
70
|
+
// Kage: compatibilidad de API.
|
|
71
|
+
const __kageModule58 = (() => {
|
|
72
|
+
const module = { exports: {} }; const exports = module.exports;
|
|
73
|
+
"use strict"
|
|
74
|
+
|
|
75
|
+
Object.defineProperty(exports, "__esModule", { value: true })
|
|
76
|
+
|
|
77
|
+
const Events = require("events")
|
|
78
|
+
const {
|
|
79
|
+
promises,
|
|
80
|
+
createReadStream
|
|
81
|
+
} = require("fs")
|
|
82
|
+
const { writeFile } = require("fs/promises")
|
|
83
|
+
const { createInterface } = require("readline")
|
|
84
|
+
const { delay } = require("./generics")
|
|
85
|
+
const { makeMutex } = require("./make-mutex")
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Captures events from a baileys event emitter & stores them in a file
|
|
89
|
+
* @param ev The event emitter to read events from
|
|
90
|
+
* @param filename File to save to
|
|
91
|
+
*/
|
|
92
|
+
const captureEventStream = (ev, filename) => {
|
|
93
|
+
const oldEmit = ev.emit
|
|
94
|
+
// write mutex so data is appended in order
|
|
95
|
+
const writeMutex = makeMutex()
|
|
96
|
+
// monkey patch eventemitter to capture all events
|
|
97
|
+
ev.emit = function (...args) {
|
|
98
|
+
const content = JSON.stringify({ timestamp: Date.now(), event: args[0], data: args[1] }) + '\n'
|
|
99
|
+
const result = oldEmit.apply(ev, args)
|
|
100
|
+
writeMutex.mutex(async () => {
|
|
101
|
+
await promises.writeFile(filename, content, { flag: 'a' })
|
|
102
|
+
})
|
|
103
|
+
return result
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Read event file and emit events from there
|
|
109
|
+
* @param filename filename containing event data
|
|
110
|
+
* @param delayIntervalMs delay between each event emit
|
|
111
|
+
*/
|
|
112
|
+
const readAndEmitEventStream = (filename, delayIntervalMs = 0) => {
|
|
113
|
+
const ev = new Events()
|
|
114
|
+
const fireEvents = async () => {
|
|
115
|
+
// from: https://stackoverflow.com/questions/6156501/read-a-file-one-line-at-a-time-in-node-js
|
|
116
|
+
const fileStream = createReadStream(filename)
|
|
117
|
+
const rl = createInterface({
|
|
118
|
+
input: fileStream,
|
|
119
|
+
crlfDelay: Infinity
|
|
120
|
+
})
|
|
121
|
+
// Note: we use the crlfDelay option to recognize all instances of CR LF
|
|
122
|
+
// ('\r\n') in input.txt as a single line break.
|
|
123
|
+
for await (const line of rl) {
|
|
124
|
+
if (line) {
|
|
125
|
+
const { event, data } = JSON.parse(line)
|
|
126
|
+
ev.emit(event, data)
|
|
127
|
+
delayIntervalMs && await delay(delayIntervalMs)
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
fileStream.close()
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
ev,
|
|
134
|
+
task: fireEvents()
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
module.exports = {
|
|
139
|
+
captureEventStream,
|
|
140
|
+
readAndEmitEventStream
|
|
141
|
+
}
|
|
142
|
+
return module.exports;
|
|
143
|
+
})();
|
|
144
|
+
for (const key of Object.keys(__kageModule58)) {
|
|
145
|
+
if (key !== '__esModule' && !Object.prototype.hasOwnProperty.call(exports,key)) Object.defineProperty(exports,key,{enumerable:true,configurable:true,get:()=>__kageModule58[key]});
|
|
146
|
+
}
|
|
@@ -39,3 +39,98 @@ Object.assign(exports.Browsers, {
|
|
|
39
39
|
ubuntu: browser => ['Ubuntu', browser || 'Chrome', '22.04.0'],
|
|
40
40
|
appropriate: browser => exports.Browsers(browser || 'Chrome')
|
|
41
41
|
});
|
|
42
|
+
|
|
43
|
+
// Kage: compatibilidad de API.
|
|
44
|
+
const __kageModule59 = (() => {
|
|
45
|
+
const module = { exports: {} }; const exports = module.exports;
|
|
46
|
+
"use strict"
|
|
47
|
+
|
|
48
|
+
Object.defineProperty(exports, "__esModule", { value: true })
|
|
49
|
+
|
|
50
|
+
const {
|
|
51
|
+
platform,
|
|
52
|
+
release
|
|
53
|
+
} = require("os")
|
|
54
|
+
const { proto } = require("../../WAProto")
|
|
55
|
+
|
|
56
|
+
const PLATFORM_MAP = {
|
|
57
|
+
aix: 'AIX',
|
|
58
|
+
darwin: 'Mac OS',
|
|
59
|
+
win32: 'Windows',
|
|
60
|
+
android: 'Android',
|
|
61
|
+
freebsd: 'FreeBSD',
|
|
62
|
+
openbsd: 'OpenBSD',
|
|
63
|
+
sunos: 'Solaris',
|
|
64
|
+
linux: undefined,
|
|
65
|
+
haiku: undefined,
|
|
66
|
+
cygwin: undefined,
|
|
67
|
+
netbsd: undefined
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const Browsers = {
|
|
71
|
+
ubuntu: browser => ['Ubuntu', browser, '22.04.4'],
|
|
72
|
+
macOS: browser => ['Mac OS', browser, '14.4.1'],
|
|
73
|
+
baileys: browser => ['Baileys', browser, '6.5.0'],
|
|
74
|
+
windows: browser => ['Windows', browser, '10.0.22631'],
|
|
75
|
+
//android: browser => [browser, 'Android', ''],
|
|
76
|
+
/** The appropriate browser based on your OS & release */
|
|
77
|
+
appropriate: browser => [PLATFORM_MAP[platform()] || 'Ubuntu', browser, release()]
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const getPlatformId = (browser) => {
|
|
81
|
+
const platformType = proto.DeviceProps.PlatformType[browser.toUpperCase()]
|
|
82
|
+
return platformType ? platformType.toString() : '1' //chrome
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
module.exports = {
|
|
86
|
+
Browsers,
|
|
87
|
+
getPlatformId
|
|
88
|
+
}
|
|
89
|
+
return module.exports;
|
|
90
|
+
})();
|
|
91
|
+
for (const key of Object.keys(__kageModule59)) {
|
|
92
|
+
if (key !== '__esModule' && !Object.prototype.hasOwnProperty.call(exports,key)) Object.defineProperty(exports,key,{enumerable:true,configurable:true,get:()=>__kageModule59[key]});
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Kage: funciones avanzadas.
|
|
96
|
+
const __kageModule162 = (() => {
|
|
97
|
+
const module = { exports: {} }; const exports = module.exports;
|
|
98
|
+
"use strict";
|
|
99
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
100
|
+
exports.getPlatformId = exports.Browsers = void 0;
|
|
101
|
+
const node_os_1 = require("node:os");
|
|
102
|
+
const index_js_1 = require("../../WAProto/index.js");
|
|
103
|
+
const PLATFORM_MAP = {
|
|
104
|
+
aix: 'AIX',
|
|
105
|
+
darwin: 'Mac OS',
|
|
106
|
+
win32: 'Windows',
|
|
107
|
+
android: 'Android',
|
|
108
|
+
freebsd: 'FreeBSD',
|
|
109
|
+
openbsd: 'OpenBSD',
|
|
110
|
+
sunos: 'Solaris',
|
|
111
|
+
linux: undefined,
|
|
112
|
+
haiku: undefined,
|
|
113
|
+
cygwin: undefined,
|
|
114
|
+
netbsd: undefined
|
|
115
|
+
};
|
|
116
|
+
exports.Browsers = {
|
|
117
|
+
ubuntu: browser => ['Ubuntu', browser, '22.04.4'],
|
|
118
|
+
macOS: browser => ['Mac OS', browser, '14.4.1'],
|
|
119
|
+
baileys: browser => ['Baileys', browser, '6.5.0'],
|
|
120
|
+
windows: browser => ['Windows', browser, '10.0.22631'],
|
|
121
|
+
android: browser => [browser, 'Android', ''],
|
|
122
|
+
/** The appropriate browser based on your OS & release */
|
|
123
|
+
appropriate: browser => [PLATFORM_MAP[(0, node_os_1.platform)()] || 'Ubuntu', browser, (0, node_os_1.release)()]
|
|
124
|
+
};
|
|
125
|
+
const getPlatformId = (browser) => {
|
|
126
|
+
const platformType = index_js_1.proto.DeviceProps.PlatformType[browser.toUpperCase()];
|
|
127
|
+
return platformType ? platformType.toString() : '1'; //chrome
|
|
128
|
+
};
|
|
129
|
+
exports.getPlatformId = getPlatformId;
|
|
130
|
+
|
|
131
|
+
return module.exports;
|
|
132
|
+
})();
|
|
133
|
+
for (const key of Object.keys(__kageModule162)) {
|
|
134
|
+
if (key !== '__esModule' && !Object.prototype.hasOwnProperty.call(exports,key)) Object.defineProperty(exports,key,{enumerable:true,configurable:true,get:()=>__kageModule162[key]});
|
|
135
|
+
}
|
|
136
|
+
Object.defineProperty(exports, Symbol.for('kage.advanced'), {value:__kageModule162, configurable:true});
|