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.
Files changed (216) hide show
  1. package/Example/connection.cjs +4 -0
  2. package/README.MD +4726 -48
  3. package/WAProto/WAProto.proto +3395 -415
  4. package/WAProto/compat.cjs +12 -0
  5. package/WAProto/index.d.ts +47104 -19888
  6. package/WAProto/index.js +131979 -57361
  7. package/lib/Addon/http-error.js +43 -0
  8. package/lib/Addon/index.js +32 -0
  9. package/lib/Addon/keyed-db.js +250 -0
  10. package/lib/Addon/link-preview.js +82 -0
  11. package/lib/Defaults/baileys-version.json +3 -0
  12. package/lib/Defaults/connection.js +110 -0
  13. package/lib/Defaults/constants.js +156 -0
  14. package/lib/Defaults/history.js +46 -0
  15. package/lib/Defaults/index.js +230 -0
  16. package/lib/Defaults/media.js +104 -0
  17. package/lib/Defaults/phonenumber-mcc.json +223 -0
  18. package/lib/Defaults/prefix.js +44 -0
  19. package/lib/Extensions/business-advanced.js +382 -0
  20. package/lib/Extensions/business.js +159 -0
  21. package/lib/Extensions/chats-advanced.js +1106 -0
  22. package/lib/Extensions/chats.js +349 -0
  23. package/lib/Extensions/communities-advanced.js +430 -0
  24. package/lib/Extensions/community.js +94 -0
  25. package/lib/Extensions/groups-advanced.js +343 -0
  26. package/lib/Extensions/index.js +30 -0
  27. package/lib/Extensions/messages-recv-advanced.js +1690 -0
  28. package/lib/Extensions/messages-send-advanced.js +622 -0
  29. package/lib/Extensions/messages-send.js +1380 -0
  30. package/lib/Extensions/newsletter-advanced.js +228 -0
  31. package/lib/Extensions/newsletter.js +72 -0
  32. package/lib/Extensions/socket.js +389 -0
  33. package/lib/Modded/message_builder.js +2084 -4
  34. package/lib/Signal/Group/ciphertext-message.js +54 -0
  35. package/lib/Signal/Group/group-session-builder.js +124 -0
  36. package/lib/Signal/Group/group_cipher.js +216 -0
  37. package/lib/Signal/Group/index.js +124 -0
  38. package/lib/Signal/Group/keyhelper.js +108 -0
  39. package/lib/Signal/Group/sender-chain-key.js +83 -0
  40. package/lib/Signal/Group/sender-key-distribution-message.js +157 -0
  41. package/lib/Signal/Group/sender-key-message.js +166 -0
  42. package/lib/Signal/Group/sender-key-name.js +130 -0
  43. package/lib/Signal/Group/sender-key-record.js +113 -0
  44. package/lib/Signal/Group/sender-key-state.js +208 -0
  45. package/lib/Signal/Group/sender-message-key.js +82 -0
  46. package/lib/Signal/libsignal.js +935 -0
  47. package/lib/Signal/lid-mapping.js +545 -1
  48. package/lib/Socket/Client/index.js +60 -0
  49. package/lib/Socket/Client/types.js +51 -0
  50. package/lib/Socket/Client/websocket.js +152 -0
  51. package/lib/Socket/business.js +831 -0
  52. package/lib/Socket/chats.js +2535 -49
  53. package/lib/Socket/communities.js +450 -1
  54. package/lib/Socket/community.js +1022 -0
  55. package/lib/Socket/dugong.js +1 -1
  56. package/lib/Socket/groups.js +747 -0
  57. package/lib/Socket/index.js +60 -2
  58. package/lib/Socket/messages-recv.js +3450 -5
  59. package/lib/Socket/messages-send.js +3123 -0
  60. package/lib/Socket/mex.js +126 -1
  61. package/lib/Socket/newsletter.js +465 -0
  62. package/lib/Socket/socket.js +2217 -1
  63. package/lib/Store/index.js +79 -0
  64. package/lib/Store/make-cache-manager-store.js +186 -0
  65. package/lib/Store/make-in-memory-store.js +878 -0
  66. package/lib/Store/make-ordered-dictionary.js +187 -0
  67. package/lib/Store/object-repository.js +78 -0
  68. package/lib/Types/Auth.js +25 -0
  69. package/lib/Types/Bussines.js +25 -1
  70. package/lib/Types/Call.js +25 -0
  71. package/lib/Types/Chat.js +39 -0
  72. package/lib/Types/Contact.js +25 -0
  73. package/lib/Types/Events.js +25 -0
  74. package/lib/Types/GroupMetadata.js +25 -0
  75. package/lib/Types/Label.js +76 -0
  76. package/lib/Types/LabelAssociation.js +40 -0
  77. package/lib/Types/Message.js +57 -0
  78. package/lib/Types/Mex.js +56 -1
  79. package/lib/Types/MexUpdates.js +46 -0
  80. package/lib/Types/Newsletter.js +56 -0
  81. package/lib/Types/Product.js +25 -0
  82. package/lib/Types/RichType.js +23 -0
  83. package/lib/Types/Signal.js +25 -0
  84. package/lib/Types/Socket.js +25 -0
  85. package/lib/Types/State.js +92 -0
  86. package/lib/Types/USync.js +25 -0
  87. package/lib/Types/index.js +133 -0
  88. package/lib/Utils/auth-utils.js +703 -0
  89. package/lib/Utils/automation-tools.js +51 -16
  90. package/lib/Utils/baileys-event-stream.js +146 -0
  91. package/lib/Utils/browser-utils.js +95 -0
  92. package/lib/Utils/business.js +525 -0
  93. package/lib/Utils/chat-utils.js +1861 -0
  94. package/lib/Utils/companion-reg-client-utils.js +55 -1
  95. package/lib/Utils/crypto.js +355 -0
  96. package/lib/Utils/decode-wa-message.js +709 -0
  97. package/lib/Utils/event-buffer.js +1323 -8
  98. package/lib/Utils/generics.js +945 -1
  99. package/lib/Utils/history.js +266 -0
  100. package/lib/Utils/identity-change-handler.js +62 -1
  101. package/lib/Utils/index.js +114 -0
  102. package/lib/Utils/link-preview.js +179 -0
  103. package/lib/Utils/logger.js +42 -0
  104. package/lib/Utils/lt-hash.js +73 -0
  105. package/lib/Utils/make-mutex.js +104 -0
  106. package/lib/Utils/message-inspector.js +110 -0
  107. package/lib/Utils/message-retry-manager.js +507 -2
  108. package/lib/Utils/messages-media.js +1931 -1
  109. package/lib/Utils/messages.js +3748 -0
  110. package/lib/Utils/noise-handler.js +423 -0
  111. package/lib/Utils/offline-node-processor.js +53 -1
  112. package/lib/Utils/pre-key-manager.js +255 -1
  113. package/lib/Utils/process-message.js +1592 -0
  114. package/lib/Utils/reporting-utils.js +272 -1
  115. package/lib/Utils/rich-message-utils.js +377 -0
  116. package/lib/Utils/rich-messages.js +1 -1
  117. package/lib/Utils/signal.js +437 -0
  118. package/lib/Utils/stanza-ack.js +51 -1
  119. package/lib/Utils/status-refresh.js +37 -0
  120. package/lib/Utils/status-tools.js +4 -2
  121. package/lib/Utils/sync-action-utils.js +63 -1
  122. package/lib/Utils/tc-token-utils.js +185 -1
  123. package/lib/Utils/terminal-banner.js +31 -0
  124. package/lib/Utils/use-multi-file-auth-state.js +271 -0
  125. package/lib/Utils/use-single-file-auth-state.js +108 -0
  126. package/lib/Utils/use-sqlite-auth-state.js +142 -0
  127. package/lib/Utils/validate-connection.js +497 -1
  128. package/lib/Utils/view-once-compat.js +13 -5
  129. package/lib/VoIP/audio-feeder.js +150 -0
  130. package/lib/VoIP/index.js +289 -0
  131. package/lib/VoIP/relay-transport.js +608 -0
  132. package/lib/VoIP/signaling.js +583 -0
  133. package/lib/VoIP/types.js +30 -0
  134. package/lib/VoIP/wasm-engine.js +1261 -2
  135. package/lib/VoIP/worker-bootstrap.js +1090 -2
  136. package/lib/WABinary/constants.js +2805 -0
  137. package/lib/WABinary/decode.js +649 -2
  138. package/lib/WABinary/encode.js +564 -2
  139. package/lib/WABinary/generic-utils.js +401 -0
  140. package/lib/WABinary/index.js +82 -0
  141. package/lib/WABinary/jid-utils.js +290 -0
  142. package/lib/WABinary/types.js +25 -0
  143. package/lib/WAM/BinaryInfo.js +50 -0
  144. package/lib/WAM/constants.js +45747 -0
  145. package/lib/WAM/encode.js +393 -0
  146. package/lib/WAM/index.js +78 -0
  147. package/lib/WAUSync/Protocols/USyncBotProfileProtocol.js +135 -0
  148. package/lib/WAUSync/Protocols/USyncContactProtocol.js +110 -0
  149. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +142 -0
  150. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +85 -0
  151. package/lib/WAUSync/Protocols/USyncLIDProtocol.js +69 -0
  152. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +107 -0
  153. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +38 -1
  154. package/lib/WAUSync/Protocols/index.js +83 -0
  155. package/lib/WAUSync/USyncQuery.js +241 -2
  156. package/lib/WAUSync/USyncUser.js +86 -0
  157. package/lib/WAUSync/index.js +78 -0
  158. package/lib/assets/wasm/loader.js +1875 -1
  159. package/lib/assets/wasm/worker-modules.js +11047 -1
  160. package/lib/index.d.ts +126 -0
  161. package/lib/index.js +53 -21
  162. package/lib/index.mjs +437 -0
  163. package/licenses/upstream-MIT.txt +22 -0
  164. package/maintenance/api-coverage.json +1642 -0
  165. package/maintenance/archivos-sha256.json +207 -0
  166. package/maintenance/consumer-validation.log +3 -0
  167. package/maintenance/dependency-audit.json +4 -4
  168. package/maintenance/extension-inventory.json +57 -0
  169. package/maintenance/protocol-update.json +1101 -0
  170. package/maintenance/protocol-wire-audit.json +4 -0
  171. package/maintenance/reference-socket-surface.json +209 -0
  172. package/maintenance/resumen-validacion.json +50 -0
  173. package/maintenance/validation.log +2725 -0
  174. package/maintenance/verification.json +566 -0
  175. package/package.json +107 -9
  176. package/scripts/check-imports.cjs +10 -0
  177. package/scripts/check-package.cjs +40 -0
  178. package/scripts/check-syntax.cjs +1 -1
  179. package/scripts/generate-protobuf.cjs +6 -1
  180. package/scripts/generate-public-types.cjs +9 -0
  181. package/scripts/kage-base64-fix.cjs +45 -0
  182. package/scripts/maintenance.cjs +10 -0
  183. package/test/advanced.test.cjs +24 -0
  184. package/test/base64-fix.test.cjs +49 -0
  185. package/test/maintenance.test.cjs +1 -1
  186. package/test/npm-publication.test.cjs +141 -0
  187. package/test/recepcion-reparada.test.cjs +98 -0
  188. package/test/resilience-binary.test.cjs +69 -0
  189. package/test/resilience-transport.test.cjs +34 -0
  190. package/test/types.test.ts +5 -0
  191. package/test/upgrade.test.cjs +104 -0
  192. package/tsconfig.json +20 -0
  193. package/WAProto/p.html +0 -1
  194. package/lib/KageExtra/Modded/message_builder.js +0 -2330
  195. package/lib/KageExtra/VoIP/audio-feeder.js +0 -136
  196. package/lib/KageExtra/VoIP/index.js +0 -282
  197. package/lib/KageExtra/VoIP/relay-transport.js +0 -559
  198. package/lib/KageExtra/VoIP/signaling.js +0 -603
  199. package/lib/KageExtra/VoIP/types.js +0 -17
  200. package/lib/KageExtra/VoIP/wasm-engine.js +0 -1214
  201. package/lib/KageExtra/VoIP/worker-bootstrap.js +0 -1042
  202. package/lib/KageExtra/assets/wasm/loader.js +0 -5
  203. package/lib/KageExtra/assets/wasm/whatsapp.wasm +0 -0
  204. package/lib/KageExtra/assets/wasm/worker-modules.js +0 -273
  205. package/lib/KageExtra/index.js +0 -3
  206. package/lib/KageExtra/package.json +0 -1
  207. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +0 -53
  208. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +0 -24
  209. package/maintenance/revision-full-check.txt +0 -1097
  210. package/maintenance/revision-library-tests.tap +0 -1088
  211. package/maintenance/revision-protobuf.txt +0 -5
  212. package/maintenance/revision-syntax.txt +0 -5
  213. package/maintenance/schema-coverage.json +0 -23
  214. package/maintenance/schema-merge.json +0 -30
  215. package/maintenance/validation-node20.txt +0 -191
  216. 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
- stream = await download({ ...raw, message: media.message }, 'stream', { options: { timeout: timeoutMs } }, { logger, reuploadRequest: conn.updateMediaMessage?.bind(conn) });
37
- if (stopped) { stream.destroy?.(); throw new Error('MEDIA_TIMEOUT'); }
38
- for await (const chunk of stream) {
39
- if (stopped) throw new Error('MEDIA_TIMEOUT');
40
- const data = Buffer.from(chunk); size += data.length;
41
- if (size > maxBytes) throw new Error('MEDIA_TOO_LARGE: se interrumpió al alcanzar el límite.');
42
- chunks.push(data);
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 !== 'notify') return;
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 stop = () => { active = false; conn.ev.off('messages.upsert', upsert); conn.ev.off('connection.update', closed); delete conn.__kageStopMedia; };
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 || []) if (item.key?.remoteJid === 'status@broadcast' && item.update?.message === null) status.markStatusDeleted(conn, item.key); };
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});