@mamans2973/maman 0.0.0-stage → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1275 -2
  3. package/WAProto/index.d.ts +37016 -0
  4. package/WAProto/index.js +2972 -0
  5. package/WASignalGroup/GroupProtocol.js +1697 -0
  6. package/WASignalGroup/ciphertext_message.js +16 -0
  7. package/WASignalGroup/group_cipher.js +120 -0
  8. package/WASignalGroup/group_session_builder.js +46 -0
  9. package/WASignalGroup/index.js +5 -0
  10. package/WASignalGroup/keyhelper.js +21 -0
  11. package/WASignalGroup/protobufs.js +3 -0
  12. package/WASignalGroup/queue_job.js +69 -0
  13. package/WASignalGroup/sender_chain_key.js +50 -0
  14. package/WASignalGroup/sender_key_distribution_message.js +78 -0
  15. package/WASignalGroup/sender_key_message.js +92 -0
  16. package/WASignalGroup/sender_key_name.js +70 -0
  17. package/WASignalGroup/sender_key_record.js +56 -0
  18. package/WASignalGroup/sender_key_state.js +129 -0
  19. package/WASignalGroup/sender_message_key.js +39 -0
  20. package/engine-requirements.js +1 -0
  21. package/lib/Defaults/baileys-version.json +3 -0
  22. package/lib/Defaults/index.d.ts +51 -0
  23. package/lib/Defaults/index.js +10 -0
  24. package/lib/Signal/libsignal.d.ts +3 -0
  25. package/lib/Signal/libsignal.js +9 -0
  26. package/lib/Socket/Client/index.d.ts +2 -0
  27. package/lib/Socket/Client/index.js +2 -0
  28. package/lib/Socket/Client/types.d.ts +15 -0
  29. package/lib/Socket/Client/types.js +1 -0
  30. package/lib/Socket/Client/websocket.d.ts +12 -0
  31. package/lib/Socket/Client/websocket.js +4 -0
  32. package/lib/Socket/business.d.ts +146 -0
  33. package/lib/Socket/business.js +8 -0
  34. package/lib/Socket/chats.d.ts +85 -0
  35. package/lib/Socket/chats.js +29 -0
  36. package/lib/Socket/groups.d.ts +124 -0
  37. package/lib/Socket/groups.js +14 -0
  38. package/lib/Socket/index.d.ts +146 -0
  39. package/lib/Socket/index.js +1 -0
  40. package/lib/Socket/messages-recv.d.ts +135 -0
  41. package/lib/Socket/messages-recv.js +39 -0
  42. package/lib/Socket/messages-send.d.ts +130 -0
  43. package/lib/Socket/messages-send.js +26 -0
  44. package/lib/Socket/socket.d.ts +42 -0
  45. package/lib/Socket/socket.js +25 -0
  46. package/lib/Socket/usync.d.ts +36 -0
  47. package/lib/Socket/usync.js +3 -0
  48. package/lib/Types/Auth.d.ts +103 -0
  49. package/lib/Types/Auth.js +1 -0
  50. package/lib/Types/Call.d.ts +13 -0
  51. package/lib/Types/Call.js +1 -0
  52. package/lib/Types/Chat.d.ts +112 -0
  53. package/lib/Types/Chat.js +1 -0
  54. package/lib/Types/Contact.d.ts +19 -0
  55. package/lib/Types/Contact.js +1 -0
  56. package/lib/Types/Events.d.ts +172 -0
  57. package/lib/Types/Events.js +1 -0
  58. package/lib/Types/GroupMetadata.d.ts +58 -0
  59. package/lib/Types/GroupMetadata.js +1 -0
  60. package/lib/Types/Label.d.ts +46 -0
  61. package/lib/Types/Label.js +3 -0
  62. package/lib/Types/LabelAssociation.d.ts +29 -0
  63. package/lib/Types/LabelAssociation.js +1 -0
  64. package/lib/Types/Message.d.ts +267 -0
  65. package/lib/Types/Message.js +1 -0
  66. package/lib/Types/Product.d.ts +78 -0
  67. package/lib/Types/Product.js +1 -0
  68. package/lib/Types/Signal.d.ts +57 -0
  69. package/lib/Types/Signal.js +1 -0
  70. package/lib/Types/Socket.d.ts +121 -0
  71. package/lib/Types/Socket.js +1 -0
  72. package/lib/Types/State.d.ts +27 -0
  73. package/lib/Types/State.js +1 -0
  74. package/lib/Types/USync.d.ts +25 -0
  75. package/lib/Types/USync.js +1 -0
  76. package/lib/Types/index.d.ts +63 -0
  77. package/lib/Types/index.js +4 -0
  78. package/lib/Utils/auth-utils.d.ts +18 -0
  79. package/lib/Utils/auth-utils.js +8 -0
  80. package/lib/Utils/baileys-event-stream.d.ts +16 -0
  81. package/lib/Utils/baileys-event-stream.js +3 -0
  82. package/lib/Utils/business.d.ts +22 -0
  83. package/lib/Utils/business.js +14 -0
  84. package/lib/Utils/chat-utils.d.ts +70 -0
  85. package/lib/Utils/chat-utils.js +36 -0
  86. package/lib/Utils/crypto.d.ts +40 -0
  87. package/lib/Utils/crypto.js +11 -0
  88. package/lib/Utils/decode-wa-message.d.ts +36 -0
  89. package/lib/Utils/decode-wa-message.js +9 -0
  90. package/lib/Utils/event-buffer.d.ts +35 -0
  91. package/lib/Utils/event-buffer.js +19 -0
  92. package/lib/Utils/generics.d.ts +90 -0
  93. package/lib/Utils/generics.js +22 -0
  94. package/lib/Utils/history.d.ts +19 -0
  95. package/lib/Utils/history.js +7 -0
  96. package/lib/Utils/index.d.ts +17 -0
  97. package/lib/Utils/index.js +3 -0
  98. package/lib/Utils/link-preview.d.ts +21 -0
  99. package/lib/Utils/link-preview.js +5 -0
  100. package/lib/Utils/logger.d.ts +11 -0
  101. package/lib/Utils/logger.js +1 -0
  102. package/lib/Utils/lt-hash.d.ts +12 -0
  103. package/lib/Utils/lt-hash.js +3 -0
  104. package/lib/Utils/make-mutex.d.ts +7 -0
  105. package/lib/Utils/make-mutex.js +1 -0
  106. package/lib/Utils/messages-media.d.ts +103 -0
  107. package/lib/Utils/messages-media.js +35 -0
  108. package/lib/Utils/messages.d.ts +75 -0
  109. package/lib/Utils/messages.js +43 -0
  110. package/lib/Utils/noise-handler.d.ts +19 -0
  111. package/lib/Utils/noise-handler.js +6 -0
  112. package/lib/Utils/process-message.d.ts +41 -0
  113. package/lib/Utils/process-message.js +19 -0
  114. package/lib/Utils/signal.d.ts +33 -0
  115. package/lib/Utils/signal.js +10 -0
  116. package/lib/Utils/use-multi-file-auth-state.d.ts +12 -0
  117. package/lib/Utils/use-multi-file-auth-state.js +5 -0
  118. package/lib/Utils/validate-connection.d.ts +10 -0
  119. package/lib/Utils/validate-connection.js +10 -0
  120. package/lib/WABinary/constants.d.ts +27 -0
  121. package/lib/WABinary/constants.js +6 -0
  122. package/lib/WABinary/decode.d.ts +6 -0
  123. package/lib/WABinary/decode.js +9 -0
  124. package/lib/WABinary/encode.d.ts +2 -0
  125. package/lib/WABinary/encode.js +9 -0
  126. package/lib/WABinary/generic-utils.d.ts +14 -0
  127. package/lib/WABinary/generic-utils.js +7 -0
  128. package/lib/WABinary/index.d.ts +5 -0
  129. package/lib/WABinary/index.js +2 -0
  130. package/lib/WABinary/jid-utils.d.ts +35 -0
  131. package/lib/WABinary/jid-utils.js +5 -0
  132. package/lib/WABinary/types.d.ts +18 -0
  133. package/lib/WABinary/types.js +1 -0
  134. package/lib/WAM/BinaryInfo.d.ts +8 -0
  135. package/lib/WAM/BinaryInfo.js +1 -0
  136. package/lib/WAM/constants.d.ts +39 -0
  137. package/lib/WAM/constants.js +492 -0
  138. package/lib/WAM/encode.d.ts +2 -0
  139. package/lib/WAM/encode.js +7 -0
  140. package/lib/WAM/index.d.ts +3 -0
  141. package/lib/WAM/index.js +2 -0
  142. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +9 -0
  143. package/lib/WAUSync/Protocols/USyncContactProtocol.js +2 -0
  144. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +22 -0
  145. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +3 -0
  146. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +12 -0
  147. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +2 -0
  148. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +12 -0
  149. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +2 -0
  150. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +25 -0
  151. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +4 -0
  152. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +8 -0
  153. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +1 -0
  154. package/lib/WAUSync/Protocols/index.d.ts +4 -0
  155. package/lib/WAUSync/Protocols/index.js +2 -0
  156. package/lib/WAUSync/USyncQuery.d.ts +28 -0
  157. package/lib/WAUSync/USyncQuery.js +4 -0
  158. package/lib/WAUSync/USyncUser.d.ts +12 -0
  159. package/lib/WAUSync/USyncUser.js +1 -0
  160. package/lib/WAUSync/index.d.ts +3 -0
  161. package/lib/WAUSync/index.js +2 -0
  162. package/lib/index.d.ts +11 -0
  163. package/lib/index.js +3 -0
  164. package/package.json +93 -4
@@ -0,0 +1,36 @@
1
+ import { proto } from '../../WAProto';
2
+ import { SignalRepository } from '../Types';
3
+ import { BinaryNode } from '../WABinary';
4
+ import { ILogger } from './logger';
5
+ export declare const NO_MESSAGE_FOUND_ERROR_TEXT = "Message absent from node";
6
+ export declare const MISSING_KEYS_ERROR_TEXT = "Key used already or never filled";
7
+ export declare const NACK_REASONS: {
8
+ ParsingError: number;
9
+ UnrecognizedStanza: number;
10
+ UnrecognizedStanzaClass: number;
11
+ UnrecognizedStanzaType: number;
12
+ InvalidProtobuf: number;
13
+ InvalidHostedCompanionStanza: number;
14
+ MissingMessageSecret: number;
15
+ SignalErrorOldCounter: number;
16
+ MessageDeletedOnPeer: number;
17
+ UnhandledError: number;
18
+ UnsupportedAdminRevoke: number;
19
+ UnsupportedLIDGroup: number;
20
+ DBOperationFailed: number;
21
+ };
22
+ /**
23
+ * Decode the received node as a message.
24
+ * @note this will only parse the message, not decrypt it
25
+ */
26
+ export declare function decodeMessageNode(stanza: BinaryNode, meId: string, meLid: string): {
27
+ fullMessage: proto.IWebMessageInfo;
28
+ author: string;
29
+ sender: string;
30
+ };
31
+ export declare const decryptMessageNode: (stanza: BinaryNode, meId: string, meLid: string, repository: SignalRepository, logger: ILogger) => {
32
+ fullMessage: proto.IWebMessageInfo;
33
+ category: string;
34
+ author: string;
35
+ decrypt(): Promise<void>;
36
+ };
@@ -0,0 +1,9 @@
1
+ Object.defineProperty(exports,"__esModule",{value:!0});exports.decryptMessageNode=exports.NACK_REASONS=exports.MISSING_KEYS_ERROR_TEXT=exports.NO_MESSAGE_FOUND_ERROR_TEXT=void 0;exports.decodeMessageNode=decodeMessageNode;const boom_1=require("@hapi/boom"),WAProto_1=require("../../WAProto"),WABinary_1=require("../WABinary"),generics_1=require("./generics");exports.NO_MESSAGE_FOUND_ERROR_TEXT="Message absent from node";exports.MISSING_KEYS_ERROR_TEXT="Key used already or never filled";
2
+ exports.NACK_REASONS={ParsingError:487,UnrecognizedStanza:488,UnrecognizedStanzaClass:489,UnrecognizedStanzaType:490,InvalidProtobuf:491,InvalidHostedCompanionStanza:493,MissingMessageSecret:495,SignalErrorOldCounter:496,MessageDeletedOnPeer:499,UnhandledError:500,UnsupportedAdminRevoke:550,UnsupportedLIDGroup:551,DBOperationFailed:552};
3
+ function decodeMessageNode(a,q,u){var e;let f,c;const n=a.attrs.id,b=a.attrs.from,g=a.attrs.participant;var d=a.attrs.recipient;var k=r=>(0,WABinary_1.areJidsSameUser)(r,q),h=r=>(0,WABinary_1.areJidsSameUser)(r,u);if((0,WABinary_1.isJidUser)(b)||(0,WABinary_1.isLidUser)(b)){if(d&&!(0,WABinary_1.isJidMetaIa)(d)){if(!(0,WABinary_1.areJidsSameUser)(b,q)&&!(0,WABinary_1.areJidsSameUser)(b,u))throw new boom_1.Boom("receipient present, but msg not from me",{data:a});f=d}else f=b;d="chat";c=b}else if((0,WABinary_1.isJidGroup)(b)){if(!g)throw new boom_1.Boom("No participant in group message");
4
+ d="group";c=g;f=b}else if((0,WABinary_1.isJidBroadcast)(b)){if(!g)throw new boom_1.Boom("No participant in group message");d=(0,WABinary_1.areJidsSameUser)(g,q);d=(0,WABinary_1.isJidStatusBroadcast)(b)?d?"direct_peer_status":"other_status":d?"peer_broadcast":"other_broadcast";f=b;c=g}else if((0,WABinary_1.isJidNewsletter)(b))d="newsletter",c=f=b;else throw new boom_1.Boom("Unknown message type",{data:a});h=((0,WABinary_1.isLidUser)(b)?h:k)(a.attrs.participant||a.attrs.from);k=null===(e=null===a||
5
+ void 0===a?void 0:a.attrs)||void 0===e?void 0:e.notify;e={remoteJid:f,fromMe:h,id:n,participant:g};a={key:e,messageTimestamp:+a.attrs.t,pushName:k,broadcast:(0,WABinary_1.isJidBroadcast)(b)};e.fromMe&&(a.status=WAProto_1.proto.WebMessageInfo.Status.SERVER_ACK);return{fullMessage:a,author:c,sender:"chat"===d?c:f}}
6
+ const decryptMessageNode=(a,q,u,e,f)=>{const {fullMessage:c,author:n,sender:b}=decodeMessageNode(a,q,u);return{fullMessage:c,category:a.attrs.category,author:n,async decrypt(){var g;let d=0;if(Array.isArray(a.content))for(const {tag:h,attrs:r,content:p}of a.content){if("verified_name"===h&&p instanceof Uint8Array){var k=WAProto_1.proto.VerifiedNameCertificate.decode(p);k=WAProto_1.proto.VerifiedNameCertificate.Details.decode(k.details);c.verifiedBizName=k.verifiedName}if("enc"!==h&&"plaintext"!==
7
+ h)continue;if(!(p instanceof Uint8Array))continue;d+=1;let t;try{const l="plaintext"===h?"plaintext":r.type;switch(l){case "skmsg":t=await e.decryptGroupMessage({group:b,authorJid:n,msg:p});break;case "pkmsg":case "msg":const v=(0,WABinary_1.isJidUser)(b)?b:n;t=await e.decryptMessage({jid:v,type:l,ciphertext:p});break;case "plaintext":t=p;break;default:throw Error(`Unknown e2e type: ${l}`);}let m=WAProto_1.proto.Message.decode("plaintext"!==l?(0,generics_1.unpadRandomMax16)(t):t);m=(null===(g=m.deviceSentMessage)||
8
+ void 0===g?void 0:g.message)||m;if(m.senderKeyDistributionMessage)try{await e.processSenderKeyDistributionMessage({authorJid:n,item:m.senderKeyDistributionMessage})}catch(v){f.error({key:c.key,err:v},"failed to decrypt message")}c.message?Object.assign(c.message,m):c.message=m}catch(l){f.error({key:c.key,err:l},"failed to decrypt message"),c.messageStubType=WAProto_1.proto.WebMessageInfo.StubType.CIPHERTEXT,c.messageStubParameters=[l.message]}}d||(c.messageStubType=WAProto_1.proto.WebMessageInfo.StubType.CIPHERTEXT,
9
+ c.messageStubParameters=[exports.NO_MESSAGE_FOUND_ERROR_TEXT])}}};exports.decryptMessageNode=decryptMessageNode;
@@ -0,0 +1,35 @@
1
+ import { BaileysEventEmitter, BaileysEventMap } from '../Types';
2
+ import { ILogger } from './logger';
3
+ /**
4
+ * A map that contains a list of all events that have been triggered
5
+ *
6
+ * Note, this can contain different type of events
7
+ * this can make processing events extremely efficient -- since everything
8
+ * can be done in a single transaction
9
+ */
10
+ type BaileysEventData = Partial<BaileysEventMap>;
11
+ type BaileysBufferableEventEmitter = BaileysEventEmitter & {
12
+ /** Use to process events in a batch */
13
+ process(handler: (events: BaileysEventData) => void | Promise<void>): (() => void);
14
+ /**
15
+ * starts buffering events, call flush() to release them
16
+ * */
17
+ buffer(): void;
18
+ /** buffers all events till the promise completes */
19
+ createBufferedFunction<A extends any[], T>(work: (...args: A) => Promise<T>): ((...args: A) => Promise<T>);
20
+ /**
21
+ * flushes all buffered events
22
+ * @param force if true, will flush all data regardless of any pending buffers
23
+ * @returns returns true if the flush actually happened, otherwise false
24
+ */
25
+ flush(force?: boolean): boolean;
26
+ /** is there an ongoing buffer */
27
+ isBuffering(): boolean;
28
+ };
29
+ /**
30
+ * The event buffer logically consolidates different events into a single event
31
+ * making the data processing more efficient.
32
+ * @param ev the baileys event emitter
33
+ */
34
+ export declare const makeEventBuffer: (logger: ILogger) => BaileysBufferableEventEmitter;
35
+ export {};
@@ -0,0 +1,19 @@
1
+ var __importDefault=this&&this.__importDefault||function(a){return a&&a.__esModule?a:{"default":a}};Object.defineProperty(exports,"__esModule",{value:!0});exports.makeEventBuffer=void 0;
2
+ const events_1=__importDefault(require("events")),Types_1=require("../Types"),generics_1=require("./generics"),messages_1=require("./messages"),process_message_1=require("./process-message"),BUFFERABLE_EVENT="messaging-history.set chats.upsert chats.update chats.delete contacts.upsert contacts.update messages.upsert messages.update messages.delete messages.reaction message-receipt.update groups.update".split(" "),BUFFERABLE_EVENT_SET=new Set(BUFFERABLE_EVENT),makeEventBuffer=a=>{function b(){t+=1}
3
+ function e(f=!1){if(!t||!f&&--t)return!1;f=makeBufferData();const k=Object.values(n.chatUpdates);let l=0;for(var g of k)g.conditional&&(l+=1,f.chatUpdates[g.id]=g,delete n.chatUpdates[g.id]);g=consolidateEvents(n);Object.keys(g).length&&d.emit("event",g);n=f;a.trace({conditionalChatUpdatesLeft:l},"released buffered events");return!0}const d=new events_1.default,m=new Set;let n=makeBufferData(),t=0;d.on("event",f=>{for(const k in f)d.emit(k,f[k])});return{process(f){const k=l=>{f(l)};d.on("event",
4
+ k);return()=>{d.off("event",k)}},emit(f,k){return t&&BUFFERABLE_EVENT_SET.has(f)?(append(n,m,f,k,a),!0):d.emit("event",{[f]:k})},isBuffering(){return 0<t},buffer:b,flush:e,createBufferedFunction(f){return async(...k)=>{b();try{return await f(...k)}finally{e()}}},on:(...f)=>d.on(...f),off:(...f)=>d.off(...f),removeAllListeners:(...f)=>d.removeAllListeners(...f)}};exports.makeEventBuffer=makeEventBuffer;
5
+ const makeBufferData=()=>({historySets:{chats:{},messages:{},contacts:{},isLatest:!1,empty:!0},chatUpserts:{},chatUpdates:{},chatDeletes:new Set,contactUpserts:{},contactUpdates:{},messageUpserts:{},messageUpdates:{},messageReactions:{},messageDeletes:{},messageReceipts:{},groupUpdates:{}});
6
+ function append(a,b,e,d,m){function n(q){const h=q.id,c=a.chatUpdates[h];if(c){const p=c.conditional?c.conditional(a):!0;p?(delete c.conditional,m.debug({chatId:h},"absorbed chat update in existing chat"),Object.assign(q,concatChats(c,q)),delete a.chatUpdates[h]):!1===p&&(m.debug({chatId:h},"chat update condition fail, removing"),delete a.chatUpdates[h])}}function t(q){var h=q.key.remoteJid;h=a.chatUpdates[h]||a.chatUpserts[h];(0,process_message_1.isRealMessage)(q,"")&&(0,process_message_1.shouldIncrementChatUnread)(q)&&
7
+ "number"===typeof(null===h||void 0===h?void 0:h.unreadCount)&&0<h.unreadCount&&(m.debug({chatId:h.id},"decrementing chat counter"),--h.unreadCount,0===h.unreadCount&&delete h.unreadCount)}var f,k,l;switch(e){case "messaging-history.set":for(const c of d.chats){if(l=a.historySets.chats[c.id])l.endOfHistoryTransferType=c.endOfHistoryTransferType;l||b.has(c.id)||(a.historySets.chats[c.id]=c,b.add(c.id),n(c))}for(var g of d.contacts)if(l=a.historySets.contacts[g.id])Object.assign(l,(0,generics_1.trimUndefined)(g));
8
+ else{l=`c:${g.id}`;var r=g.notify||g.name||g.verifiedName;if(!b.has(l)||r)a.historySets.contacts[g.id]=g,b.add(l)}for(const c of d.messages)g=stringifyMessageKey(c.key),a.historySets.messages[g]||b.has(g)||(a.historySets.messages[g]=c,b.add(g));a.historySets.empty=!1;a.historySets.syncType=d.syncType;a.historySets.progress=d.progress;a.historySets.peerDataRequestSessionId=d.peerDataRequestSessionId;a.historySets.isLatest=d.isLatest||a.historySets.isLatest;break;case "chats.upsert":for(const c of d)b=
9
+ a.chatUpserts[c.id],b||(b=a.historySets[c.id])&&m.debug({chatId:c.id},"absorbed chat upsert in chat set"),b?b=concatChats(b,c):(b=c,a.chatUpserts[c.id]=b),n(b),a.chatDeletes.has(c.id)&&a.chatDeletes.delete(c.id);break;case "chats.update":for(r of d)b=r.id,(d=r.conditional?r.conditional(a):!0)?(delete r.conditional,(d=a.historySets.chats[b]||a.chatUpserts[b])?concatChats(d,r):a.chatUpdates[b]=concatChats(a.chatUpdates[b]||{},r)):void 0===d&&(a.chatUpdates[b]=r),a.chatDeletes.has(b)&&a.chatDeletes.delete(b);
10
+ break;case "chats.delete":for(const c of d)a.chatDeletes.has(c)||a.chatDeletes.add(c),a.chatUpdates[c]&&delete a.chatUpdates[c],a.chatUpserts[c]&&delete a.chatUpserts[c],a.historySets.chats[c]&&delete a.historySets.chats[c];break;case "contacts.upsert":for(const c of d)b=a.contactUpserts[c.id],b||(b=a.historySets.contacts[c.id])&&m.debug({contactId:c.id},"absorbed contact upsert in contact set"),b?b=Object.assign(b,(0,generics_1.trimUndefined)(c)):(b=c,a.contactUpserts[c.id]=b),a.contactUpdates[c.id]&&
11
+ (b=Object.assign(a.contactUpdates[c.id],(0,generics_1.trimUndefined)(c)),delete a.contactUpdates[c.id]);break;case "contacts.update":for(const c of d)b=c.id,(d=a.historySets.contacts[b]||a.contactUpserts[b])?Object.assign(d,c):a.contactUpdates[b]=Object.assign(a.contactUpdates[b]||{},c);break;case "messages.upsert":const {messages:q,type:h}=d;for(const c of q)b=stringifyMessageKey(c.key),d=null===(f=a.messageUpserts[b])||void 0===f?void 0:f.message,d||(d=a.historySets.messages[b])&&m.debug({messageId:b},
12
+ "absorbed message upsert in message set"),d&&(c.messageTimestamp=d.messageTimestamp),a.messageUpdates[b]&&(m.debug("absorbed prior message update in message upsert"),Object.assign(c,a.messageUpdates[b].update),delete a.messageUpdates[b]),a.historySets.messages[b]?a.historySets.messages[b]=c:a.messageUpserts[b]={message:c,type:"notify"===h||"notify"===(null===(k=a.messageUpserts[b])||void 0===k?void 0:k.type)?"notify":h};break;case "messages.update":for(const {key:c,update:p}of d)b=stringifyMessageKey(c),
13
+ (d=a.historySets.messages[b]||(null===(l=a.messageUpserts[b])||void 0===l?void 0:l.message))?(Object.assign(d,p),p.status!==Types_1.WAMessageStatus.READ||c.fromMe||t(d)):(d=a.messageUpdates[b]||{key:c,update:{}},Object.assign(d.update,p),a.messageUpdates[b]=d);break;case "messages.delete":if("keys"in d){({keys:b}=d);for(const c of b)b=stringifyMessageKey(c),a.messageDeletes[b]||(a.messageDeletes[b]=c),a.messageUpserts[b]&&delete a.messageUpserts[b],a.messageUpdates[b]&&delete a.messageUpdates[b]}break;
14
+ case "messages.reaction":for(const {key:c,reaction:p}of d)b=stringifyMessageKey(c),(d=a.messageUpserts[b])?(0,messages_1.updateMessageWithReaction)(d.message,p):(a.messageReactions[b]=a.messageReactions[b]||{key:c,reactions:[]},(0,messages_1.updateMessageWithReaction)(a.messageReactions[b],p));break;case "message-receipt.update":for(const {key:c,receipt:p}of d)b=stringifyMessageKey(c),(d=a.messageUpserts[b])?(0,messages_1.updateMessageWithReceipt)(d.message,p):(a.messageReceipts[b]=a.messageReceipts[b]||
15
+ {key:c,userReceipt:[]},(0,messages_1.updateMessageWithReceipt)(a.messageReceipts[b],p));break;case "groups.update":for(const c of d)b=c.id,d=a.groupUpdates[b]||{},a.groupUpdates[b]||(a.groupUpdates[b]=Object.assign(d,c));break;default:throw Error(`"${e}" cannot be buffered`);}}
16
+ function consolidateEvents(a){const b={};a.historySets.empty||(b["messaging-history.set"]={chats:Object.values(a.historySets.chats),messages:Object.values(a.historySets.messages),contacts:Object.values(a.historySets.contacts),syncType:a.historySets.syncType,progress:a.historySets.progress,isLatest:a.historySets.isLatest,peerDataRequestSessionId:a.historySets.peerDataRequestSessionId});var e=Object.values(a.chatUpserts);e.length&&(b["chats.upsert"]=e);e=Object.values(a.chatUpdates);e.length&&(b["chats.update"]=
17
+ e);e=Array.from(a.chatDeletes);e.length&&(b["chats.delete"]=e);e=Object.values(a.messageUpserts);if(e.length){const d=e[0].type;b["messages.upsert"]={messages:e.map(m=>m.message),type:d}}e=Object.values(a.messageUpdates);e.length&&(b["messages.update"]=e);e=Object.values(a.messageDeletes);e.length&&(b["messages.delete"]={keys:e});e=Object.values(a.messageReactions).flatMap(({key:d,reactions:m})=>m.flatMap(n=>({key:d,reaction:n})));e.length&&(b["messages.reaction"]=e);e=Object.values(a.messageReceipts).flatMap(({key:d,
18
+ userReceipt:m})=>m.flatMap(n=>({key:d,receipt:n})));e.length&&(b["message-receipt.update"]=e);e=Object.values(a.contactUpserts);e.length&&(b["contacts.upsert"]=e);e=Object.values(a.contactUpdates);e.length&&(b["contacts.update"]=e);a=Object.values(a.groupUpdates);a.length&&(b["groups.update"]=a);return b}
19
+ function concatChats(a,b){null===b.unreadCount&&0>a.unreadCount&&(a.unreadCount=void 0,b.unreadCount=void 0);"number"===typeof a.unreadCount&&"number"===typeof b.unreadCount&&(b={...b},0<=b.unreadCount&&(b.unreadCount=Math.max(b.unreadCount,0)+Math.max(a.unreadCount,0)));return Object.assign(a,b)}const stringifyMessageKey=a=>`${a.remoteJid},${a.id},${a.fromMe?"1":"0"}`;
@@ -0,0 +1,90 @@
1
+ import { AxiosRequestConfig } from 'axios';
2
+ import { proto } from '../../WAProto';
3
+ import { BaileysEventEmitter, BaileysEventMap, BrowsersMap, ConnectionState, WACallUpdateType, WAVersion } from '../Types';
4
+ import { BinaryNode } from '../WABinary';
5
+ export declare const Browsers: BrowsersMap;
6
+ export declare const getPlatformId: (browser: string) => any;
7
+ export declare const BufferJSON: {
8
+ replacer: (k: any, value: any) => any;
9
+ reviver: (_: any, value: any) => any;
10
+ };
11
+ export declare const getKeyAuthor: (key: proto.IMessageKey | undefined | null, meId?: string) => string;
12
+ export declare const writeRandomPadMax16: (msg: Uint8Array) => Buffer<ArrayBuffer>;
13
+ export declare const unpadRandomMax16: (e: Uint8Array | Buffer) => Uint8Array<ArrayBuffer>;
14
+ export declare const encodeWAMessage: (message: proto.IMessage) => Buffer<ArrayBuffer>;
15
+ export declare const generateRegistrationId: () => number;
16
+ export declare const encodeBigEndian: (e: number, t?: number) => Uint8Array<ArrayBuffer>;
17
+ export declare const toNumber: (t: Long | number | null | undefined) => number;
18
+ /** unix timestamp of a date in seconds */
19
+ export declare const unixTimestampSeconds: (date?: Date) => number;
20
+ export type DebouncedTimeout = ReturnType<typeof debouncedTimeout>;
21
+ export declare const debouncedTimeout: (intervalMs?: number, task?: () => void) => {
22
+ start: (newIntervalMs?: number, newTask?: () => void) => void;
23
+ cancel: () => void;
24
+ setTask: (newTask: () => void) => () => void;
25
+ setInterval: (newInterval: number) => number;
26
+ };
27
+ export declare const delay: (ms: number) => Promise<void>;
28
+ export declare const delayCancellable: (ms: number) => {
29
+ delay: Promise<void>;
30
+ cancel: () => void;
31
+ };
32
+ export declare function promiseTimeout<T>(ms: number | undefined, promise: (resolve: (v: T) => void, reject: (error: any) => void) => void): Promise<T>;
33
+ export declare const generateMessageIDV2: (userId?: string) => string;
34
+ export declare const generateMessageID: () => string;
35
+ export declare function bindWaitForEvent<T extends keyof BaileysEventMap>(ev: BaileysEventEmitter, event: T): (check: (u: BaileysEventMap[T]) => Promise<boolean | undefined>, timeoutMs?: number) => Promise<void>;
36
+ export declare const bindWaitForConnectionUpdate: (ev: BaileysEventEmitter) => (check: (u: Partial<ConnectionState>) => Promise<boolean | undefined>, timeoutMs?: number) => Promise<void>;
37
+ /**
38
+ * utility that fetches latest baileys version from the master branch.
39
+ * Use to ensure your WA connection is always on the latest version
40
+ */
41
+ export declare const fetchLatestBaileysVersion: (options?: AxiosRequestConfig<{}>) => Promise<{
42
+ version: WAVersion;
43
+ isLatest: boolean;
44
+ error?: undefined;
45
+ } | {
46
+ version: WAVersion;
47
+ isLatest: boolean;
48
+ error: any;
49
+ }>;
50
+ /**
51
+ * A utility that fetches the latest web version of whatsapp.
52
+ * Use to ensure your WA connection is always on the latest version
53
+ */
54
+ export declare const fetchLatestWaWebVersion: (options: AxiosRequestConfig<{}>) => Promise<{
55
+ version: WAVersion;
56
+ isLatest: boolean;
57
+ error?: undefined;
58
+ } | {
59
+ version: WAVersion;
60
+ isLatest: boolean;
61
+ error: any;
62
+ }>;
63
+ /** unique message tag prefix for MD clients */
64
+ export declare const generateMdTagPrefix: () => string;
65
+ /**
66
+ * Given a type of receipt, returns what the new status of the message should be
67
+ * @param type type from receipt
68
+ */
69
+ export declare const getStatusFromReceiptType: (type: string | undefined) => proto.WebMessageInfo.Status;
70
+ /**
71
+ * Stream errors generally provide a reason, map that to a baileys DisconnectReason
72
+ * @param reason the string reason given, eg. "conflict"
73
+ */
74
+ export declare const getErrorCodeFromStreamError: (node: BinaryNode) => {
75
+ reason: string;
76
+ statusCode: number;
77
+ };
78
+ export declare const getCallStatusFromNode: ({ tag, attrs }: BinaryNode) => WACallUpdateType;
79
+ export declare const getCodeFromWSError: (error: Error) => number;
80
+ /**
81
+ * Is the given platform WA business
82
+ * @param platform AuthenticationCreds.platform
83
+ */
84
+ export declare const isWABusinessPlatform: (platform: string) => platform is "smbi" | "smba";
85
+ export declare function trimUndefined(obj: {
86
+ [_: string]: any;
87
+ }): {
88
+ [_: string]: any;
89
+ };
90
+ export declare function bytesToCrockford(buffer: Buffer): string;
@@ -0,0 +1,22 @@
1
+ var __importDefault=this&&this.__importDefault||function(a){return a&&a.__esModule?a:{"default":a}};Object.defineProperty(exports,"__esModule",{value:!0});
2
+ exports.isWABusinessPlatform=exports.getCodeFromWSError=exports.getCallStatusFromNode=exports.getErrorCodeFromStreamError=exports.getStatusFromReceiptType=exports.generateMdTagPrefix=exports.fetchLatestWaWebVersion=exports.fetchLatestBaileysVersion=exports.bindWaitForConnectionUpdate=exports.generateMessageID=exports.generateMessageIDV2=exports.delayCancellable=exports.delay=exports.debouncedTimeout=exports.unixTimestampSeconds=exports.toNumber=exports.encodeBigEndian=exports.generateRegistrationId=
3
+ exports.encodeWAMessage=exports.unpadRandomMax16=exports.writeRandomPadMax16=exports.getKeyAuthor=exports.BufferJSON=exports.getPlatformId=exports.Browsers=void 0;exports.promiseTimeout=promiseTimeout;exports.bindWaitForEvent=bindWaitForEvent;exports.trimUndefined=trimUndefined;exports.bytesToCrockford=bytesToCrockford;
4
+ const boom_1=require("@hapi/boom"),axios_1=__importDefault(require("axios")),crypto_1=require("crypto"),os_1=require("os"),WAProto_1=require("../../WAProto"),baileys_version_json_1=require("../Defaults/baileys-version.json"),Types_1=require("../Types"),WABinary_1=require("../WABinary"),PLATFORM_MAP={aix:"AIX",darwin:"Mac OS",win32:"Windows",android:"Android",freebsd:"FreeBSD",openbsd:"OpenBSD",sunos:"Solaris"};
5
+ exports.Browsers={ubuntu:a=>["Ubuntu",a,"22.04.4"],macOS:a=>["Mac OS",a,"14.4.1"],baileys:a=>["Baileys",a,"6.5.0"],windows:a=>["Windows",a,"10.0.22631"],appropriate:a=>[PLATFORM_MAP[(0,os_1.platform)()]||"Ubuntu",a,(0,os_1.release)()]};const getPlatformId=a=>(a=WAProto_1.proto.DeviceProps.PlatformType[a.toUpperCase()])?a.toString():"1";exports.getPlatformId=getPlatformId;
6
+ exports.BufferJSON={replacer:(a,b)=>Buffer.isBuffer(b)||b instanceof Uint8Array||"Buffer"===(null===b||void 0===b?void 0:b.type)?{type:"Buffer",data:Buffer.from((null===b||void 0===b?void 0:b.data)||b).toString("base64")}:b,reviver:(a,b)=>"object"!==typeof b||!b||!0!==b.buffer&&"Buffer"!==b.type?b:(a=b.data||b.value,"string"===typeof a?Buffer.from(a,"base64"):Buffer.from(a||[]))};
7
+ const getKeyAuthor=(a,b="me")=>((null===a||void 0===a?0:a.fromMe)?b:(null===a||void 0===a?void 0:a.participant)||(null===a||void 0===a?void 0:a.remoteJid))||"";exports.getKeyAuthor=getKeyAuthor;const writeRandomPadMax16=a=>{const b=(0,crypto_1.randomBytes)(1);b[0]&=15;b[0]||(b[0]=15);return Buffer.concat([a,Buffer.alloc(b[0],b[0])])};exports.writeRandomPadMax16=writeRandomPadMax16;
8
+ const unpadRandomMax16=a=>{a=new Uint8Array(a);if(0===a.length)throw Error("unpadPkcs7 given empty bytes");var b=a[a.length-1];if(b>a.length)throw Error(`unpad given ${a.length} bytes, but pad is ${b}`);return new Uint8Array(a.buffer,a.byteOffset,a.length-b)};exports.unpadRandomMax16=unpadRandomMax16;const encodeWAMessage=a=>(0,exports.writeRandomPadMax16)(WAProto_1.proto.Message.encode(a).finish());exports.encodeWAMessage=encodeWAMessage;
9
+ const generateRegistrationId=()=>Uint16Array.from((0,crypto_1.randomBytes)(2))[0]&16383;exports.generateRegistrationId=generateRegistrationId;const encodeBigEndian=(a,b=4)=>{const c=new Uint8Array(b);for(--b;0<=b;b--)c[b]=255&a,a>>>=8;return c};exports.encodeBigEndian=encodeBigEndian;const toNumber=a=>"object"===typeof a&&a?"toNumber"in a?a.toNumber():a.low:a||0;exports.toNumber=toNumber;const unixTimestampSeconds=(a=new Date)=>Math.floor(a.getTime()/1E3);exports.unixTimestampSeconds=unixTimestampSeconds;
10
+ const debouncedTimeout=(a=1E3,b)=>{let c;return{start:(d,e)=>{b=e||b;a=d||a;c&&clearTimeout(c);c=setTimeout(()=>null===b||void 0===b?void 0:b(),a)},cancel:()=>{c&&clearTimeout(c);c=void 0},setTask:d=>b=d,setInterval:d=>a=d}};exports.debouncedTimeout=debouncedTimeout;const delay=a=>(0,exports.delayCancellable)(a).delay;exports.delay=delay;
11
+ const delayCancellable=a=>{const b=Error().stack;let c,d;return{delay:new Promise((e,f)=>{c=setTimeout(e,a);d=f}),cancel:()=>{clearTimeout(c);d(new boom_1.Boom("Cancelled",{statusCode:500,data:{stack:b}}))}}};exports.delayCancellable=delayCancellable;
12
+ async function promiseTimeout(a,b){if(!a)return new Promise(b);const c=Error().stack,{delay:d,cancel:e}=(0,exports.delayCancellable)(a);return(new Promise((f,g)=>{d.then(()=>g(new boom_1.Boom("Timed Out",{statusCode:Types_1.DisconnectReason.timedOut,data:{stack:c}}))).catch(h=>g(h));b(f,g)})).finally(e)}
13
+ const generateMessageIDV2=a=>{const b=Buffer.alloc(44);b.writeBigUInt64BE(BigInt(Math.floor(Date.now()/1E3)));a&&(a=(0,WABinary_1.jidDecode)(a),null===a||void 0===a?0:a.user)&&(b.write(a.user,8),b.write("@c.us",8+a.user.length));(0,crypto_1.randomBytes)(16).copy(b,28);return"3EB0"+(0,crypto_1.createHash)("sha256").update(b).digest().toString("hex").toUpperCase().substring(0,18)};exports.generateMessageIDV2=generateMessageIDV2;const generateMessageID=()=>"3EB0"+(0,crypto_1.randomBytes)(18).toString("hex").toUpperCase();
14
+ exports.generateMessageID=generateMessageID;function bindWaitForEvent(a,b){return async(c,d)=>{let e,f;await promiseTimeout(d,(g,h)=>{f=({connection:k,lastDisconnect:l})=>{"close"===k&&h((null===l||void 0===l?void 0:l.error)||new boom_1.Boom("Connection Closed",{statusCode:Types_1.DisconnectReason.connectionClosed}))};a.on("connection.update",f);e=async k=>{await c(k)&&g()};a.on(b,e)}).finally(()=>{a.off(b,e);a.off("connection.update",f)})}}
15
+ const bindWaitForConnectionUpdate=a=>bindWaitForEvent(a,"connection.update");exports.bindWaitForConnectionUpdate=bindWaitForConnectionUpdate;const fetchLatestBaileysVersion=async(a={})=>{try{return{version:(await axios_1.default.get("https://raw.githubusercontent.com/WhiskeySockets/Baileys/master/src/Defaults/baileys-version.json",{...a,responseType:"json"})).data.version,isLatest:!0}}catch(b){return{version:baileys_version_json_1.version,isLatest:!1,error:b}}};exports.fetchLatestBaileysVersion=fetchLatestBaileysVersion;
16
+ const fetchLatestWaWebVersion=async a=>{try{const {data:b}=await axios_1.default.get("https://web.whatsapp.com/sw.js",{...a,responseType:"json"}),c=b.match(/\\?"client_revision\\?":\s*(\d+)/);return null!==c&&void 0!==c&&c[1]?{version:[2,3E3,+c[1]],isLatest:!0}:{version:baileys_version_json_1.version,isLatest:!1,error:{message:"Could not find client revision in the fetched content"}}}catch(b){return{version:baileys_version_json_1.version,isLatest:!1,error:b}}};exports.fetchLatestWaWebVersion=fetchLatestWaWebVersion;
17
+ const generateMdTagPrefix=()=>{const a=(0,crypto_1.randomBytes)(4);return`${a.readUInt16BE()}.${a.readUInt16BE(2)}-`};exports.generateMdTagPrefix=generateMdTagPrefix;const STATUS_MAP={sender:WAProto_1.proto.WebMessageInfo.Status.SERVER_ACK,played:WAProto_1.proto.WebMessageInfo.Status.PLAYED,read:WAProto_1.proto.WebMessageInfo.Status.READ,"read-self":WAProto_1.proto.WebMessageInfo.Status.READ},getStatusFromReceiptType=a=>"undefined"===typeof a?WAProto_1.proto.WebMessageInfo.Status.DELIVERY_ACK:STATUS_MAP[a];
18
+ exports.getStatusFromReceiptType=getStatusFromReceiptType;const CODE_MAP={conflict:Types_1.DisconnectReason.connectionReplaced},getErrorCodeFromStreamError=a=>{var [b]=(0,WABinary_1.getAllBinaryNodeChildren)(a);b=(null===b||void 0===b?void 0:b.tag)||"unknown";a=+(a.attrs.code||CODE_MAP[b]||Types_1.DisconnectReason.badSession);a===Types_1.DisconnectReason.restartRequired&&(b="restart required");return{reason:b,statusCode:a}};exports.getErrorCodeFromStreamError=getErrorCodeFromStreamError;
19
+ const getCallStatusFromNode=({tag:a,attrs:b})=>{switch(a){case "offer":case "offer_notice":a="offer";break;case "terminate":a="timeout"===b.reason?"timeout":"terminate";break;case "reject":a="reject";break;case "accept":a="accept";break;default:a="ringing"}return a};exports.getCallStatusFromNode=getCallStatusFromNode;
20
+ const UNEXPECTED_SERVER_CODE_TEXT="Unexpected server response: ",getCodeFromWSError=a=>{var b,c,d;let e=500;if(null===(b=null===a||void 0===a?void 0:a.message)||void 0===b?0:b.includes(UNEXPECTED_SERVER_CODE_TEXT))a=+(null===a||void 0===a?NaN:a.message.slice(UNEXPECTED_SERVER_CODE_TEXT.length)),!Number.isNaN(a)&&400<=a&&(e=a);else if((null===(c=null===a||void 0===a?void 0:a.code)||void 0===c?0:c.startsWith("E"))||(null===(d=null===a||void 0===a?void 0:a.message)||void 0===d?0:d.includes("timed out")))e=
21
+ 408;return e};exports.getCodeFromWSError=getCodeFromWSError;const isWABusinessPlatform=a=>"smbi"===a||"smba"===a;exports.isWABusinessPlatform=isWABusinessPlatform;function trimUndefined(a){for(const b in a)"undefined"===typeof a[b]&&delete a[b];return a}const CROCKFORD_CHARACTERS="123456789ABCDEFGHJKLMNPQRSTVWXYZ";
22
+ function bytesToCrockford(a){let b=0,c=0;const d=[];for(const e of a)for(b=b<<8|e&255,c+=8;5<=c;)d.push(CROCKFORD_CHARACTERS.charAt(b>>>c-5&31)),c-=5;0<c&&d.push(CROCKFORD_CHARACTERS.charAt(b<<5-c&31));return d.join("")};
@@ -0,0 +1,19 @@
1
+ import { AxiosRequestConfig } from 'axios';
2
+ import { proto } from '../../WAProto';
3
+ import { Chat, Contact } from '../Types';
4
+ export declare const downloadHistory: (msg: proto.Message.IHistorySyncNotification, options: AxiosRequestConfig<{}>) => Promise<proto.HistorySync>;
5
+ export declare const processHistoryMessage: (item: proto.IHistorySync) => {
6
+ chats: Chat[];
7
+ contacts: Contact[];
8
+ messages: proto.IWebMessageInfo[];
9
+ syncType: proto.HistorySync.HistorySyncType;
10
+ progress: number | null | undefined;
11
+ };
12
+ export declare const downloadAndProcessHistorySyncNotification: (msg: proto.Message.IHistorySyncNotification, options: AxiosRequestConfig<{}>) => Promise<{
13
+ chats: Chat[];
14
+ contacts: Contact[];
15
+ messages: proto.IWebMessageInfo[];
16
+ syncType: proto.HistorySync.HistorySyncType;
17
+ progress: number | null | undefined;
18
+ }>;
19
+ export declare const getHistoryMsg: (message: proto.IMessage) => proto.Message.IHistorySyncNotification | null | undefined;
@@ -0,0 +1,7 @@
1
+ Object.defineProperty(exports,"__esModule",{value:!0});exports.getHistoryMsg=exports.downloadAndProcessHistorySyncNotification=exports.processHistoryMessage=exports.downloadHistory=void 0;
2
+ const util_1=require("util"),zlib_1=require("zlib"),WAProto_1=require("../../WAProto"),Types_1=require("../Types"),WABinary_1=require("../WABinary"),generics_1=require("./generics"),messages_1=require("./messages"),messages_media_1=require("./messages-media"),inflatePromise=(0,util_1.promisify)(zlib_1.inflate),downloadHistory=async(a,d)=>{a=await (0,messages_media_1.downloadContentFromMessage)(a,"md-msg-hist",{options:d});d=[];for await(var e of a)d.push(e);e=Buffer.concat(d);e=await inflatePromise(e);
3
+ return WAProto_1.proto.HistorySync.decode(e)};exports.downloadHistory=downloadHistory;
4
+ const processHistoryMessage=a=>{var d,e,g;const h=[],f=[],k=[];switch(a.syncType){case WAProto_1.proto.HistorySync.HistorySyncType.INITIAL_BOOTSTRAP:case WAProto_1.proto.HistorySync.HistorySyncType.RECENT:case WAProto_1.proto.HistorySync.HistorySyncType.FULL:case WAProto_1.proto.HistorySync.HistorySyncType.ON_DEMAND:for(const b of a.conversations){f.push({id:b.id,name:b.name||void 0});var c=b.messages||[];delete b.messages;delete b.archived;delete b.muteEndTime;delete b.pinned;for(const l of c)c=
5
+ l.message,h.push(c),null!==(d=b.messages)&&void 0!==d&&d.length||(b.messages=[{message:c}]),c.key.fromMe||b.lastMessageRecvTimestamp||(b.lastMessageRecvTimestamp=(0,generics_1.toNumber)(c.messageTimestamp)),(c.messageStubType===Types_1.WAMessageStubType.BIZ_PRIVACY_MODE_TO_BSP||c.messageStubType===Types_1.WAMessageStubType.BIZ_PRIVACY_MODE_TO_FB)&&(null===(e=c.messageStubParameters)||void 0===e?0:e[0])&&f.push({id:c.key.participant||c.key.remoteJid,verifiedName:null===(g=c.messageStubParameters)||
6
+ void 0===g?void 0:g[0]});(0,WABinary_1.isJidUser)(b.id)&&b.readOnly&&b.archived&&delete b.readOnly;k.push({...b})}break;case WAProto_1.proto.HistorySync.HistorySyncType.PUSH_NAME:for(c of a.pushnames)f.push({id:c.id,notify:c.pushname})}return{chats:k,contacts:f,messages:h,syncType:a.syncType,progress:a.progress}};exports.processHistoryMessage=processHistoryMessage;const downloadAndProcessHistorySyncNotification=async(a,d)=>{a=await (0,exports.downloadHistory)(a,d);return(0,exports.processHistoryMessage)(a)};
7
+ exports.downloadAndProcessHistorySyncNotification=downloadAndProcessHistorySyncNotification;const getHistoryMsg=a=>{var d;a=a?(0,messages_1.normalizeMessageContent)(a):void 0;return null===(d=null===a||void 0===a?void 0:a.protocolMessage)||void 0===d?void 0:d.historySyncNotification};exports.getHistoryMsg=getHistoryMsg;
@@ -0,0 +1,17 @@
1
+ export * from './generics';
2
+ export * from './decode-wa-message';
3
+ export * from './messages';
4
+ export * from './messages-media';
5
+ export * from './validate-connection';
6
+ export * from './crypto';
7
+ export * from './signal';
8
+ export * from './noise-handler';
9
+ export * from './history';
10
+ export * from './chat-utils';
11
+ export * from './lt-hash';
12
+ export * from './auth-utils';
13
+ export * from './baileys-event-stream';
14
+ export * from './use-multi-file-auth-state';
15
+ export * from './link-preview';
16
+ export * from './event-buffer';
17
+ export * from './process-message';
@@ -0,0 +1,3 @@
1
+ var __createBinding=this&&this.__createBinding||(Object.create?function(d,b,a,c){void 0===c&&(c=a);var e=Object.getOwnPropertyDescriptor(b,a);if(!e||("get"in e?!b.__esModule:e.writable||e.configurable))e={enumerable:!0,get:function(){return b[a]}};Object.defineProperty(d,c,e)}:function(d,b,a,c){void 0===c&&(c=a);d[c]=b[a]}),__exportStar=this&&this.__exportStar||function(d,b){for(var a in d)"default"===a||Object.prototype.hasOwnProperty.call(b,a)||__createBinding(b,d,a)};
2
+ Object.defineProperty(exports,"__esModule",{value:!0});__exportStar(require("./generics"),exports);__exportStar(require("./decode-wa-message"),exports);__exportStar(require("./messages"),exports);__exportStar(require("./messages-media"),exports);__exportStar(require("./validate-connection"),exports);__exportStar(require("./crypto"),exports);__exportStar(require("./signal"),exports);__exportStar(require("./noise-handler"),exports);__exportStar(require("./history"),exports);
3
+ __exportStar(require("./chat-utils"),exports);__exportStar(require("./lt-hash"),exports);__exportStar(require("./auth-utils"),exports);__exportStar(require("./baileys-event-stream"),exports);__exportStar(require("./use-multi-file-auth-state"),exports);__exportStar(require("./link-preview"),exports);__exportStar(require("./event-buffer"),exports);__exportStar(require("./process-message"),exports);
@@ -0,0 +1,21 @@
1
+ import { AxiosRequestConfig } from 'axios';
2
+ import { WAMediaUploadFunction, WAUrlInfo } from '../Types';
3
+ import { ILogger } from './logger';
4
+ export type URLGenerationOptions = {
5
+ thumbnailWidth: number;
6
+ fetchOpts: {
7
+ /** Timeout in ms */
8
+ timeout: number;
9
+ proxyUrl?: string;
10
+ headers?: AxiosRequestConfig<{}>['headers'];
11
+ };
12
+ uploadImage?: WAMediaUploadFunction;
13
+ logger?: ILogger;
14
+ };
15
+ /**
16
+ * Given a piece of text, checks for any URL present, generates link preview for the same and returns it
17
+ * Return undefined if the fetch failed or no URL was found
18
+ * @param text first matched URL in text
19
+ * @returns the URL info required to generate link preview
20
+ */
21
+ export declare const getUrlInfo: (text: string, opts?: URLGenerationOptions) => Promise<WAUrlInfo | undefined>;
@@ -0,0 +1,5 @@
1
+ var __createBinding=this&&this.__createBinding||(Object.create?function(b,a,e,c){void 0===c&&(c=e);var d=Object.getOwnPropertyDescriptor(a,e);if(!d||("get"in d?!a.__esModule:d.writable||d.configurable))d={enumerable:!0,get:function(){return a[e]}};Object.defineProperty(b,c,d)}:function(b,a,e,c){void 0===c&&(c=e);b[c]=a[e]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(b,a){Object.defineProperty(b,"default",{enumerable:!0,value:a})}:function(b,a){b["default"]=a}),__importStar=
2
+ this&&this.__importStar||function(){var b=function(a){b=Object.getOwnPropertyNames||function(e){var c=[],d;for(d in e)Object.prototype.hasOwnProperty.call(e,d)&&(c[c.length]=d);return c};return b(a)};return function(a){if(a&&a.__esModule)return a;var e={};if(null!=a)for(var c=b(a),d=0;d<c.length;d++)"default"!==c[d]&&__createBinding(e,a,c[d]);__setModuleDefault(e,a);return e}}();Object.defineProperty(exports,"__esModule",{value:!0});exports.getUrlInfo=void 0;
3
+ const messages_1=require("./messages"),messages_media_1=require("./messages-media"),THUMBNAIL_WIDTH_PX=192,getCompressedJpegThumbnail=async(b,{thumbnailWidth:a,fetchOpts:e})=>{b=await (0,messages_media_1.getHttpStream)(b,e);return await (0,messages_media_1.extractImageThumb)(b,a)},getUrlInfo=async(b,a={thumbnailWidth:THUMBNAIL_WIDTH_PX,fetchOpts:{timeout:3E3}})=>{var e;try{const {getLinkPreview:c}=await Promise.resolve().then(()=>__importStar(require("link-preview-js")));let d=b;b.startsWith("https://")||
4
+ b.startsWith("http://")||(d="https://"+d);const h=await c(d,{...a.fetchOpts,followRedirects:"follow",handleRedirects:(f,g)=>{f=new URL(f);g=new URL(g);return g.hostname===f.hostname||g.hostname==="www."+f.hostname||"www."+g.hostname===f.hostname?(1,!0):!1},headers:a.fetchOpts});if(h&&"title"in h&&h.title){const [f]=h.images,g={"canonical-url":h.url,"matched-text":b,title:h.title,description:h.description,originalThumbnailUrl:f};if(a.uploadImage){const {imageMessage:k}=await (0,messages_1.prepareWAMessageMedia)({image:{url:f}},
5
+ {upload:a.uploadImage,mediaTypeOverride:"thumbnail-link",options:a.fetchOpts});g.jpegThumbnail=(null===k||void 0===k?0:k.jpegThumbnail)?Buffer.from(k.jpegThumbnail):void 0;g.highQualityThumbnail=k||void 0}else try{g.jpegThumbnail=f?(await getCompressedJpegThumbnail(f,a)).buffer:void 0}catch(k){null===(e=a.logger)||void 0===e||e.debug({err:k.stack,url:d},"error in generating thumbnail")}return g}}catch(c){if(!c.message.includes("receive a valid"))throw c;}};exports.getUrlInfo=getUrlInfo;
@@ -0,0 +1,11 @@
1
+ export interface ILogger {
2
+ level: string;
3
+ child(obj: Record<string, unknown>): ILogger;
4
+ trace(obj: unknown, msg?: string): any;
5
+ debug(obj: unknown, msg?: string): any;
6
+ info(obj: unknown, msg?: string): any;
7
+ warn(obj: unknown, msg?: string): any;
8
+ error(obj: unknown, msg?: string): any;
9
+ }
10
+ declare const _default: import("pino").Logger<never, boolean>;
11
+ export default _default;
@@ -0,0 +1 @@
1
+ var __importDefault=this&&this.__importDefault||function(a){return a&&a.__esModule?a:{"default":a}};Object.defineProperty(exports,"__esModule",{value:!0});const pino_1=__importDefault(require("pino"));exports.default=(0,pino_1.default)({timestamp:()=>`,"time":"${(new Date).toJSON()}"`});
@@ -0,0 +1,12 @@
1
+ declare class d {
2
+ salt: string;
3
+ constructor(e: string);
4
+ add(e: any, t: any): any;
5
+ subtract(e: any, t: any): any;
6
+ subtractThenAdd(e: any, t: any, r: any): any;
7
+ _addSingle(e: any, t: any): Promise<ArrayBuffer>;
8
+ _subtractSingle(e: any, t: any): Promise<ArrayBuffer>;
9
+ performPointwiseWithOverflow(e: any, t: any, r: any): ArrayBuffer;
10
+ }
11
+ export declare const LT_HASH_ANTI_TAMPERING: d;
12
+ export {};
@@ -0,0 +1,3 @@
1
+ Object.defineProperty(exports,"__esModule",{value:!0});exports.LT_HASH_ANTI_TAMPERING=void 0;const crypto_1=require("./crypto"),o=128;
2
+ class d{constructor(a){this.salt=a}add(a,b){for(const c of b)a=this._addSingle(a,c);return a}subtract(a,b){for(const c of b)a=this._subtractSingle(a,c);return a}subtractThenAdd(a,b,c){return this.add(this.subtract(a,c),b)}async _addSingle(a,b){b=(new Uint8Array(await (0,crypto_1.hkdf)(Buffer.from(b),o,{info:this.salt}))).buffer;return this.performPointwiseWithOverflow(await a,b,(c,e)=>c+e)}async _subtractSingle(a,b){b=(new Uint8Array(await (0,crypto_1.hkdf)(Buffer.from(b),o,{info:this.salt}))).buffer;
3
+ return this.performPointwiseWithOverflow(await a,b,(c,e)=>c-e)}performPointwiseWithOverflow(a,b,c){a=new DataView(a);b=new DataView(b);const e=new ArrayBuffer(a.byteLength),g=new DataView(e);for(let f=0;f<a.byteLength;f+=2)g.setUint16(f,c(a.getUint16(f,!0),b.getUint16(f,!0)),!0);return e}}exports.LT_HASH_ANTI_TAMPERING=new d("WhatsApp Patch Integrity");
@@ -0,0 +1,7 @@
1
+ export declare const makeMutex: () => {
2
+ mutex<T>(code: () => Promise<T> | T): Promise<T>;
3
+ };
4
+ export type Mutex = ReturnType<typeof makeMutex>;
5
+ export declare const makeKeyedMutex: () => {
6
+ mutex<T>(key: string, task: () => Promise<T> | T): Promise<T>;
7
+ };
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,"__esModule",{value:!0});exports.makeKeyedMutex=exports.makeMutex=void 0;const makeMutex=()=>{let a=Promise.resolve();return{mutex(b){return a=(async()=>{try{await a}catch(c){}try{return await b()}finally{clearTimeout(void 0)}})()}}};exports.makeMutex=makeMutex;const makeKeyedMutex=()=>{const a={};return{mutex(b,c){a[b]||(a[b]=(0,exports.makeMutex)());return a[b].mutex(c)}}};exports.makeKeyedMutex=makeKeyedMutex;
@@ -0,0 +1,103 @@
1
+ import { Boom } from '@hapi/boom';
2
+ import { AxiosRequestConfig } from 'axios';
3
+ import { Readable, Transform } from 'stream';
4
+ import { URL } from 'url';
5
+ import { proto } from '../../WAProto';
6
+ import { DownloadableMessage, MediaConnInfo, MediaDecryptionKeyInfo, MediaType, SocketConfig, WAMediaUpload, WAMediaUploadFunction, WAMessageContent } from '../Types';
7
+ import { BinaryNode } from '../WABinary';
8
+ import { ILogger } from './logger';
9
+ export declare const hkdfInfoKey: (type: MediaType) => string;
10
+ /** generates all the keys required to encrypt/decrypt & sign a media message */
11
+ export declare function getMediaKeys(buffer: Uint8Array | string | null | undefined, mediaType: MediaType): Promise<MediaDecryptionKeyInfo>;
12
+ export declare const extractImageThumb: (bufferOrFilePath: Readable | Buffer | string, width?: number) => Promise<{
13
+ buffer: Buffer<ArrayBufferLike>;
14
+ original: {
15
+ width: number | undefined;
16
+ height: number | undefined;
17
+ };
18
+ }>;
19
+ export declare const encodeBase64EncodedStringForUpload: (b64: string) => string;
20
+ export declare const generateProfilePicture: (mediaUpload: WAMediaUpload) => Promise<{
21
+ img: Buffer<ArrayBufferLike>;
22
+ }>;
23
+ /** gets the SHA256 of the given media message */
24
+ export declare const mediaMessageSHA256B64: (message: WAMessageContent) => string | null | undefined;
25
+ export declare function getAudioDuration(buffer: Buffer | string | Readable): Promise<number | undefined>;
26
+ /**
27
+ referenced from and modifying https://github.com/wppconnect-team/wa-js/blob/main/src/chat/functions/prepareAudioWaveform.ts
28
+ */
29
+ export declare function getAudioWaveform(buffer: Buffer | string | Readable, logger?: ILogger): Promise<Uint8Array<ArrayBuffer> | undefined>;
30
+ export declare const toReadable: (buffer: Buffer) => Readable;
31
+ export declare const toBuffer: (stream: Readable) => Promise<Buffer<ArrayBuffer>>;
32
+ export declare const getStream: (item: WAMediaUpload, opts?: AxiosRequestConfig) => Promise<{
33
+ readonly stream: Readable;
34
+ readonly type: "buffer";
35
+ } | {
36
+ readonly stream: Readable;
37
+ readonly type: "readable";
38
+ } | {
39
+ readonly stream: Readable;
40
+ readonly type: "remote";
41
+ } | {
42
+ readonly stream: import("fs").ReadStream;
43
+ readonly type: "file";
44
+ }>;
45
+ /** generates a thumbnail for a given media, if required */
46
+ export declare function generateThumbnail(file: string, mediaType: 'video' | 'image', options: {
47
+ logger?: ILogger;
48
+ }): Promise<{
49
+ thumbnail: string | undefined;
50
+ originalImageDimensions: {
51
+ width: number;
52
+ height: number;
53
+ } | undefined;
54
+ }>;
55
+ export declare const getHttpStream: (url: string | URL, options?: AxiosRequestConfig & {
56
+ isStream?: true;
57
+ }) => Promise<Readable>;
58
+ type EncryptedStreamOptions = {
59
+ saveOriginalFileIfRequired?: boolean;
60
+ logger?: ILogger;
61
+ opts?: AxiosRequestConfig;
62
+ };
63
+ export declare const encryptedStream: (media: WAMediaUpload, mediaType: MediaType, { logger, saveOriginalFileIfRequired, opts }?: EncryptedStreamOptions) => Promise<{
64
+ mediaKey: Buffer<ArrayBufferLike>;
65
+ originalFilePath: string | undefined;
66
+ encFilePath: string;
67
+ mac: Buffer<ArrayBuffer>;
68
+ fileEncSha256: Buffer<ArrayBufferLike>;
69
+ fileSha256: Buffer<ArrayBufferLike>;
70
+ fileLength: number;
71
+ }>;
72
+ export type MediaDownloadOptions = {
73
+ startByte?: number;
74
+ endByte?: number;
75
+ options?: AxiosRequestConfig<{}>;
76
+ };
77
+ export declare const getUrlFromDirectPath: (directPath: string) => string;
78
+ export declare const downloadContentFromMessage: ({ mediaKey, directPath, url }: DownloadableMessage, type: MediaType, opts?: MediaDownloadOptions) => Promise<Transform>;
79
+ /**
80
+ * Decrypts and downloads an AES256-CBC encrypted file given the keys.
81
+ * Assumes the SHA256 of the plaintext is appended to the end of the ciphertext
82
+ * */
83
+ export declare const downloadEncryptedContent: (downloadUrl: string, { cipherKey, iv }: MediaDecryptionKeyInfo, { startByte, endByte, options }?: MediaDownloadOptions) => Promise<Transform>;
84
+ export declare function extensionForMediaMessage(message: WAMessageContent): string;
85
+ export declare const getWAUploadToServer: ({ customUploadHosts, fetchAgent, logger, options }: SocketConfig, refreshMediaConn: (force: boolean) => Promise<MediaConnInfo>) => WAMediaUploadFunction;
86
+ /**
87
+ * Generate a binary node that will request the phone to re-upload the media & return the newly uploaded URL
88
+ */
89
+ export declare const encryptMediaRetryRequest: (key: proto.IMessageKey, mediaKey: Buffer | Uint8Array, meId: string) => Promise<BinaryNode>;
90
+ export declare const decodeMediaRetryNode: (node: BinaryNode) => {
91
+ key: import("../Types").WAMessageKey;
92
+ media?: {
93
+ ciphertext: Uint8Array;
94
+ iv: Uint8Array;
95
+ };
96
+ error?: Boom;
97
+ };
98
+ export declare const decryptMediaRetryData: ({ ciphertext, iv }: {
99
+ ciphertext: Uint8Array;
100
+ iv: Uint8Array;
101
+ }, mediaKey: Uint8Array, msgId: string) => Promise<proto.MediaRetryNotification>;
102
+ export declare const getStatusCodeForMediaRetry: (code: number) => any;
103
+ export {};
@@ -0,0 +1,35 @@
1
+ var __createBinding=this&&this.__createBinding||(Object.create?function(a,b,c,d){void 0===d&&(d=c);var e=Object.getOwnPropertyDescriptor(b,c);if(!e||("get"in e?!b.__esModule:e.writable||e.configurable))e={enumerable:!0,get:function(){return b[c]}};Object.defineProperty(a,d,e)}:function(a,b,c,d){void 0===d&&(d=c);a[d]=b[c]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(a,b){Object.defineProperty(a,"default",{enumerable:!0,value:b})}:function(a,b){a["default"]=b}),__importStar=
2
+ this&&this.__importStar||function(){var a=function(b){a=Object.getOwnPropertyNames||function(c){var d=[],e;for(e in c)Object.prototype.hasOwnProperty.call(c,e)&&(d[d.length]=e);return d};return a(b)};return function(b){if(b&&b.__esModule)return b;var c={};if(null!=b)for(var d=a(b),e=0;e<d.length;e++)"default"!==d[e]&&__createBinding(c,b,d[e]);__setModuleDefault(c,b);return c}}(),__importDefault=this&&this.__importDefault||function(a){return a&&a.__esModule?a:{"default":a}};
3
+ Object.defineProperty(exports,"__esModule",{value:!0});
4
+ exports.getStatusCodeForMediaRetry=exports.decryptMediaRetryData=exports.decodeMediaRetryNode=exports.encryptMediaRetryRequest=exports.getWAUploadToServer=exports.downloadEncryptedContent=exports.downloadContentFromMessage=exports.getUrlFromDirectPath=exports.encryptedStream=exports.getHttpStream=exports.getStream=exports.toBuffer=exports.toReadable=exports.mediaMessageSHA256B64=exports.generateProfilePicture=exports.encodeBase64EncodedStringForUpload=exports.extractImageThumb=exports.hkdfInfoKey=
5
+ void 0;exports.getMediaKeys=getMediaKeys;exports.getAudioDuration=getAudioDuration;exports.getAudioWaveform=getAudioWaveform;exports.generateThumbnail=generateThumbnail;exports.extensionForMediaMessage=extensionForMediaMessage;
6
+ const boom_1=require("@hapi/boom"),axios_1=__importDefault(require("axios")),child_process_1=require("child_process"),Crypto=__importStar(require("crypto")),events_1=require("events"),fs_1=require("fs"),os_1=require("os"),path_1=require("path"),stream_1=require("stream"),WAProto_1=require("../../WAProto"),Defaults_1=require("../Defaults"),WABinary_1=require("../WABinary"),crypto_1=require("./crypto"),generics_1=require("./generics"),getTmpFilesDirectory=()=>(0,os_1.tmpdir)(),getImageProcessingLibrary=
7
+ async()=>{const [a,b]=await Promise.all([(async()=>await Promise.resolve().then(()=>__importStar(require("jimp"))).catch(()=>{}))(),(async()=>await Promise.resolve().then(()=>__importStar(require("sharp"))).catch(()=>{}))()]);if(b)return{sharp:b};const c=(null===a||void 0===a?void 0:a.default)||a;if(c)return{jimp:c};throw new boom_1.Boom("No image processing library available");},hkdfInfoKey=a=>`WhatsApp ${Defaults_1.MEDIA_HKDF_KEY_MAPPING[a]} Keys`;exports.hkdfInfoKey=hkdfInfoKey;
8
+ async function getMediaKeys(a,b){if(!a)throw new boom_1.Boom("Cannot derive from empty media key");"string"===typeof a&&(a=Buffer.from(a.replace("data:;base64,",""),"base64"));a=await (0,crypto_1.hkdf)(a,112,{info:(0,exports.hkdfInfoKey)(b)});return{iv:a.slice(0,16),cipherKey:a.slice(16,48),macKey:a.slice(48,80)}}
9
+ const extractVideoThumb=async(a,b,c,d)=>new Promise((e,k)=>{(0,child_process_1.exec)(`ffmpeg -ss ${c} -i ${a} -y -vf scale=${d.width}:-1 -vframes 1 -f image2 ${b}`,h=>{h?k(h):e()})}),extractImageThumb=async(a,b=32)=>{var c,d;a instanceof stream_1.Readable&&(a=await (0,exports.toBuffer)(a));const e=await getImageProcessingLibrary();if("sharp"in e&&"function"===typeof(null===(c=e.sharp)||void 0===c?void 0:c.default))return a=e.sharp.default(a),c=await a.metadata(),{buffer:await a.resize(b).jpeg({quality:50}).toBuffer(),
10
+ original:{width:c.width,height:c.height}};if("jimp"in e&&"function"===typeof(null===(d=e.jimp)||void 0===d?void 0:d.read)){const {read:k,MIME_JPEG:h,RESIZE_BILINEAR:m,AUTO:p}=e.jimp;a=await k(a);c={width:a.getWidth(),height:a.getHeight()};return{buffer:await a.quality(50).resize(b,p,m).getBufferAsync(h),original:c}}throw new boom_1.Boom("No image processing library available");};exports.extractImageThumb=extractImageThumb;
11
+ const encodeBase64EncodedStringForUpload=a=>encodeURIComponent(a.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,""));exports.encodeBase64EncodedStringForUpload=encodeBase64EncodedStringForUpload;
12
+ const generateProfilePicture=async a=>{var b,c;a=Buffer.isBuffer(a)?a:"url"in a?a.url.toString():await (0,exports.toBuffer)(a.stream);const d=await getImageProcessingLibrary();if("sharp"in d&&"function"===typeof(null===(b=d.sharp)||void 0===b?void 0:b.default))b=d.sharp.default(a).resize(640,640).jpeg({quality:50}).toBuffer();else if("jimp"in d&&"function"===typeof(null===(c=d.jimp)||void 0===c?void 0:c.read)){const {read:e,MIME_JPEG:k,RESIZE_BILINEAR:h}=d.jimp;b=await e(a);c=Math.min(b.getWidth(),
13
+ b.getHeight());b=b.crop(0,0,c,c).quality(50).resize(640,640,h).getBufferAsync(k)}else throw new boom_1.Boom("No image processing library available");return{img:await b}};exports.generateProfilePicture=generateProfilePicture;const mediaMessageSHA256B64=a=>{a=Object.values(a)[0];return(null===a||void 0===a?void 0:a.fileSha256)&&Buffer.from(a.fileSha256).toString("base64")};exports.mediaMessageSHA256B64=mediaMessageSHA256B64;
14
+ async function getAudioDuration(a){const b=await Promise.resolve().then(()=>__importStar(require("music-metadata")));let c;if(Buffer.isBuffer(a))c=await b.parseBuffer(a,void 0,{duration:!0});else if("string"===typeof a){a=(0,fs_1.createReadStream)(a);try{c=await b.parseStream(a,void 0,{duration:!0})}finally{a.destroy()}}else c=await b.parseStream(a,void 0,{duration:!0});return c.format.duration}
15
+ async function getAudioWaveform(a,b){try{var {default:c}=await eval("import('audio-decode')");if(Buffer.isBuffer(a))var d=a;else if("string"===typeof a){var e=(0,fs_1.createReadStream)(a);d=await (0,exports.toBuffer)(e)}else d=await (0,exports.toBuffer)(a);const k=(await c(d)).getChannelData(0),h=Math.floor(k.length/64);a=[];for(c=0;64>c;c++){d=h*c;e=0;for(let l=0;l<h;l++)e+=Math.abs(k[d+l]);a.push(e/h)}const m=Math.pow(Math.max(...a),-1),p=a.map(l=>l*m);return new Uint8Array(p.map(l=>Math.floor(100*
16
+ l)))}catch(k){null===b||void 0===b||b.debug("Failed to generate waveform: "+k)}}const toReadable=a=>{const b=new stream_1.Readable({read:()=>{}});b.push(a);b.push(null);return b};exports.toReadable=toReadable;const toBuffer=async a=>{const b=[];for await(const c of a)b.push(c);a.destroy();return Buffer.concat(b)};exports.toBuffer=toBuffer;
17
+ const getStream=async(a,b)=>Buffer.isBuffer(a)?{stream:(0,exports.toReadable)(a),type:"buffer"}:"stream"in a?{stream:a.stream,type:"readable"}:a.url.toString().startsWith("http://")||a.url.toString().startsWith("https://")?{stream:await (0,exports.getHttpStream)(a.url,b),type:"remote"}:{stream:(0,fs_1.createReadStream)(a.url),type:"file"};exports.getStream=getStream;
18
+ async function generateThumbnail(a,b,c){var d;let e,k;if("image"===b){const {buffer:h,original:m}=await (0,exports.extractImageThumb)(a);e=h.toString("base64");m.width&&m.height&&(k={width:m.width,height:m.height})}else if("video"===b){b=(0,path_1.join)(getTmpFilesDirectory(),(0,generics_1.generateMessageIDV2)()+".jpg");try{await extractVideoThumb(a,b,"00:00:00",{width:32,height:32}),e=(await fs_1.promises.readFile(b)).toString("base64"),await fs_1.promises.unlink(b)}catch(h){null===(d=c.logger)||
19
+ void 0===d||d.debug("could not generate video thumb: "+h)}}return{thumbnail:e,originalImageDimensions:k}}const getHttpStream=async(a,b={})=>(await axios_1.default.get(a.toString(),{...b,responseType:"stream"})).data;exports.getHttpStream=getHttpStream;
20
+ const encryptedStream=async(a,b,{logger:c,saveOriginalFileIfRequired:d,opts:e}={})=>{var k,h;const {stream:m,type:p}=await (0,exports.getStream)(a,e);null===c||void 0===c||c.debug("fetched media stream");const l=Crypto.randomBytes(32),{cipherKey:t,iv:u,macKey:r}=await getMediaKeys(l,b),v=(0,path_1.join)(getTmpFilesDirectory(),b+(0,generics_1.generateMessageIDV2)()+"-enc"),g=(0,fs_1.createWriteStream)(v);let f,n;d&&(n=(0,path_1.join)(getTmpFilesDirectory(),b+(0,generics_1.generateMessageIDV2)()+"-original"),
21
+ f=(0,fs_1.createWriteStream)(n));b=0;d=Crypto.createCipheriv("aes-256-cbc",t,u);const q=Crypto.createHmac("sha256",r).update(u),z=Crypto.createHash("sha256"),w=Crypto.createHash("sha256");try{for await(const x of m){b+=x.length;if("remote"===p&&(null===e||void 0===e?0:e.maxContentLength)&&b+x.length>e.maxContentLength)throw new boom_1.Boom(`content length exceeded when encrypting "${p}"`,{data:{media:a,type:p}});f&&(f.write(x)||await (0,events_1.once)(f,"drain"));z.update(x);var A=d.update(x);w.update(A);
22
+ q.update(A);g.write(A)}var B=d.final();w.update(B);q.update(B);g.write(B);const y=q.digest().slice(0,10);w.update(y);const C=z.digest(),D=w.digest();g.write(y);g.end();null===(k=null===f||void 0===f?void 0:f.end)||void 0===k||k.call(f);m.destroy();null===c||void 0===c||c.debug("encrypted data successfully");return{mediaKey:l,originalFilePath:n,encFilePath:v,mac:y,fileEncSha256:D,fileSha256:C,fileLength:b}}catch(y){g.destroy();null===(h=null===f||void 0===f?void 0:f.destroy)||void 0===h||h.call(f);
23
+ d.destroy();q.destroy();z.destroy();w.destroy();m.destroy();try{await fs_1.promises.unlink(v),n&&await fs_1.promises.unlink(n)}catch(C){null===c||void 0===c||c.error({err:C},"failed deleting tmp files")}throw y;}};exports.encryptedStream=encryptedStream;const DEF_HOST="mmg.whatsapp.net",AES_CHUNK_SIZE=16,toSmallestChunkSize=a=>Math.floor(a/AES_CHUNK_SIZE)*AES_CHUNK_SIZE,getUrlFromDirectPath=a=>`https://${DEF_HOST}${a}`;exports.getUrlFromDirectPath=getUrlFromDirectPath;
24
+ const downloadContentFromMessage=async({mediaKey:a,directPath:b,url:c},d,e={})=>{b=c||(0,exports.getUrlFromDirectPath)(b);a=await getMediaKeys(a,d);return(0,exports.downloadEncryptedContent)(b,a,e)};exports.downloadContentFromMessage=downloadContentFromMessage;
25
+ const downloadEncryptedContent=async(a,{cipherKey:b,iv:c},{startByte:d,endByte:e,options:k}={})=>{let h=0,m=0,p=!1;if(d){var l=toSmallestChunkSize(d||0);l&&(m=l-AES_CHUNK_SIZE,h=l,p=!0)}l=e?toSmallestChunkSize(e||0)+AES_CHUNK_SIZE:void 0;const t={...((null===k||void 0===k?void 0:k.headers)||{}),Origin:Defaults_1.DEFAULT_ORIGIN};if(m||l)t.Range=`bytes=${m}-`,l&&(t.Range+=l);a=await (0,exports.getHttpStream)(a,{...(k||{}),headers:t,maxBodyLength:Infinity,maxContentLength:Infinity});let u=Buffer.from([]),
26
+ r;const v=(g,f)=>{d||e?(f(g.slice(h>=d?void 0:Math.max(d-h,0),h+g.length<e?void 0:Math.max(e-h,0))),h+=g.length):f(g)};k=new stream_1.Transform({transform(g,f,n){g=Buffer.concat([u,g]);f=toSmallestChunkSize(g.length);u=g.slice(f);g=g.slice(0,f);r||(f=c,p&&(f=g.slice(0,AES_CHUNK_SIZE),g=g.slice(AES_CHUNK_SIZE)),r=Crypto.createDecipheriv("aes-256-cbc",b,f),e&&r.setAutoPadding(!1));try{v(r.update(g),q=>this.push(q)),n()}catch(q){n(q)}},final(g){try{v(r.final(),f=>this.push(f)),g()}catch(f){g(f)}}});
27
+ return a.pipe(k,{end:!0})};exports.downloadEncryptedContent=downloadEncryptedContent;function extensionForMediaMessage(a){const b=Object.keys(a)[0];return"locationMessage"===b||"liveLocationMessage"===b||"productMessage"===b?".jpeg":a[b].mimetype.split(";")[0].split("/")[1]}
28
+ const getWAUploadToServer=({customUploadHosts:a,fetchAgent:b,logger:c,options:d},e)=>async(k,{mediaType:h,fileEncSha256B64:m,timeoutMs:p})=>{var l,t;let u=await e(!1),r;const v=[...a,...u.hosts];m=(0,exports.encodeBase64EncodedStringForUpload)(m);for(const {hostname:f}of v){c.debug(`uploading to "${f}"`);var g=encodeURIComponent(u.auth);g=`https://${f}${Defaults_1.MEDIA_PATH_MAP[h]}/${m}?auth=${g}&token=${m}`;let n;try{if(n=(await axios_1.default.post(g,(0,fs_1.createReadStream)(k),{...d,maxRedirects:0,
29
+ headers:{...(d.headers||{}),"Content-Type":"application/octet-stream",Origin:Defaults_1.DEFAULT_ORIGIN},httpsAgent:b,timeout:p,responseType:"json",maxBodyLength:Infinity,maxContentLength:Infinity})).data,(null===n||void 0===n?0:n.url)||(null===n||void 0===n?0:n.directPath)){r={mediaUrl:n.url,directPath:n.direct_path};break}else throw u=await e(!0),Error(`upload failed, reason: ${JSON.stringify(n)}`);}catch(q){axios_1.default.isAxiosError(q)&&(n=null===(l=q.response)||void 0===l?void 0:l.data),g=f===
30
+ (null===(t=v[u.hosts.length-1])||void 0===t?void 0:t.hostname),c.warn({trace:q.stack,uploadResult:n},`Error in uploading to ${f} ${g?"":", retrying..."}`)}}if(!r)throw new boom_1.Boom("Media upload failed on all hosts",{statusCode:500});return r};exports.getWAUploadToServer=getWAUploadToServer;
31
+ const getMediaRetryKey=a=>(0,crypto_1.hkdf)(a,32,{info:"WhatsApp Media Retry Notification"}),encryptMediaRetryRequest=async(a,b,c)=>{var d=WAProto_1.proto.ServerErrorReceipt.encode({stanzaId:a.id}).finish();const e=Crypto.randomBytes(12);b=await getMediaRetryKey(b);d=(0,crypto_1.aesEncryptGCM)(d,b,e,Buffer.from(a.id));return{tag:"receipt",attrs:{id:a.id,to:(0,WABinary_1.jidNormalizedUser)(c),type:"server-error"},content:[{tag:"encrypt",attrs:{},content:[{tag:"enc_p",attrs:{},content:d},{tag:"enc_iv",
32
+ attrs:{},content:e}]},{tag:"rmr",attrs:{jid:a.remoteJid,from_me:(!!a.fromMe).toString(),participant:a.participant||void 0}}]}};exports.encryptMediaRetryRequest=encryptMediaRetryRequest;
33
+ const decodeMediaRetryNode=a=>{var b=(0,WABinary_1.getBinaryNodeChild)(a,"rmr");b={key:{id:a.attrs.id,remoteJid:b.attrs.jid,fromMe:"true"===b.attrs.from_me,participant:b.attrs.participant}};var c=(0,WABinary_1.getBinaryNodeChild)(a,"error");c?(a=+c.attrs.code,b.error=new boom_1.Boom(`Failed to re-upload media (${a})`,{data:c.attrs,statusCode:(0,exports.getStatusCodeForMediaRetry)(a)})):(c=(0,WABinary_1.getBinaryNodeChild)(a,"encrypt"),a=(0,WABinary_1.getBinaryNodeChildBuffer)(c,"enc_p"),c=(0,WABinary_1.getBinaryNodeChildBuffer)(c,
34
+ "enc_iv"),a&&c?b.media={ciphertext:a,iv:c}:b.error=new boom_1.Boom("Failed to re-upload media (missing ciphertext)",{statusCode:404}));return b};exports.decodeMediaRetryNode=decodeMediaRetryNode;const decryptMediaRetryData=async({ciphertext:a,iv:b},c,d)=>{c=await getMediaRetryKey(c);a=(0,crypto_1.aesDecryptGCM)(a,c,b,Buffer.from(d));return WAProto_1.proto.MediaRetryNotification.decode(a)};exports.decryptMediaRetryData=decryptMediaRetryData;const getStatusCodeForMediaRetry=a=>MEDIA_RETRY_STATUS_MAP[a];
35
+ exports.getStatusCodeForMediaRetry=getStatusCodeForMediaRetry;const MEDIA_RETRY_STATUS_MAP={[WAProto_1.proto.MediaRetryNotification.ResultType.SUCCESS]:200,[WAProto_1.proto.MediaRetryNotification.ResultType.DECRYPTION_ERROR]:412,[WAProto_1.proto.MediaRetryNotification.ResultType.NOT_FOUND]:404,[WAProto_1.proto.MediaRetryNotification.ResultType.GENERAL_ERROR]:418};