@hdriel/whatsapp-socket 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -69,7 +69,7 @@ const client = new WhatsappSocket({
69
69
  fileAuthStateDirectoryPath: path.resolve(__dirname, './authState/my-profile'),
70
70
 
71
71
  // Or use MongoDB for production (optional)
72
- // mongoURL: 'mongodb://localhost:27017/whatsapp-sessions',
72
+ // mongoURL: 'mongodb://localhost:27017/whatsapp-sessions-app',
73
73
 
74
74
  // logger, // Custom logger (npm stack-trace-logger) instance (optional)
75
75
 
@@ -78,8 +78,11 @@ const client = new WhatsappSocket({
78
78
 
79
79
  // Enable debug mode
80
80
  debug: true,
81
-
82
- // Connection status callback
81
+
82
+ // When failed to connecting before sending messages
83
+ onPreConnectionSendMessageFailed: (error: Error) => {...}
84
+
85
+ // Connection status callback
83
86
  onConnectionStatusChange: (status: 'open' | 'close' | 'connecting') => {
84
87
  console.log('Connection status:', status);
85
88
  },
@@ -313,7 +316,7 @@ app.use(express.json());
313
316
 
314
317
  // Initialize WhatsApp client
315
318
  const client = new WhatsappSocket({
316
- fileAuthStateDirectoryPath: path.resolve(__dirname, './authState'),
319
+ fileAuthStateDirectoryPath: path.resolve(__dirname, './authState/my-profile-data'),
317
320
  printQRInTerminal: true,
318
321
  debug: true,
319
322
  onConnectionStatusChange: (status) => {
package/dist/index.cjs CHANGED
@@ -1,3 +1,3 @@
1
- 'use strict';var re=require('fs'),ee=require('@fadzzzslebew/baileys'),U=require('ms'),j=require('qrcode'),mongodb=require('mongodb'),ie=require('pino'),musicMetadata=require('music-metadata'),path=require('path');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var re__default=/*#__PURE__*/_interopDefault(re);var ee__default=/*#__PURE__*/_interopDefault(ee);var U__default=/*#__PURE__*/_interopDefault(U);var j__default=/*#__PURE__*/_interopDefault(j);var ie__default=/*#__PURE__*/_interopDefault(ie);var x={replacer:(o,e)=>Buffer.isBuffer(e)||e instanceof Uint8Array||e?.type==="Buffer"?{type:"Buffer",data:Buffer.from(e?.data||e).toString("base64")}:e,reviver:(o,e)=>{if(typeof e=="object"&&e&&(e.buffer===true||e.type==="Buffer")){let t=e.data||e.value;return typeof t=="string"?Buffer.from(t,"base64"):Buffer.from(t||[])}return e}},$=async o=>{let e=(s,a)=>{let i={$set:{...JSON.parse(JSON.stringify(s,x.replacer))}};return o.updateOne({_id:a},i,{upsert:true})},t=async s=>{try{let a=JSON.stringify(await o.findOne({_id:s}));return JSON.parse(a,x.reviver)}catch{return null}},n=async s=>{try{await o.deleteOne({_id:s});}catch{}},r=await t("creds")||ee.initAuthCreds();return {state:{creds:r,keys:{get:async(s,a)=>{let c={};return await Promise.all(a.map(async i=>{let g=await t(`${s}-${i}`);s==="app-state-sync-key"&&g&&(g=ee.WAProto.Message.AppStateSyncKeyData.fromObject(g)),c[i]=g;})),c},set:async s=>{let a=[];for(let c of Object.keys(s))for(let i of Object.keys(s[c])){let g=s[c][i],u=`${c}-${i}`;a.push(g?e(g,u):n(u));}await Promise.all(a);}}},saveCreds:()=>e(r,"creds")}},O=$;var N=o=>U__default.default(o)/1e3;async function p(o){let t=await(await fetch(o)).arrayBuffer();return Buffer.from(t)}async function X(o,e){try{let t=await musicMetadata.parseStream(o,{mimeType:e||"audio/mpeg"});return Math.floor(t.format.duration||0)}catch(t){throw console.error("Error parsing stream:",t),t}finally{o.destroyed||o.destroy();}}async function Z(o,e){try{let t=await musicMetadata.parseBuffer(o,e||"audio/mpeg").catch(()=>null);return t?Math.floor(t.format.duration||0):0}catch(t){throw console.error("Error parsing buffer:",t),t}}async function F(o,e){return o instanceof re.ReadStream?X(o,e):Z(o,e)}async function I(o){let e=[];for await(let t of o)e.push(t);return Buffer.concat(e)}function L(o){if(o.path){let e=o.path.toString();return path.basename(e)}}var H=o=>new Promise(e=>setTimeout(e,U__default.default(o)));var E=ie__default.default({level:"silent"}),S=class o{socket;fileAuthStateDirectoryPath;mongoURL;mongoCollection="whatsapp-auth";logger;debug;printQRInTerminal;pairingPhone;customPairingCode;allowUseLastVersion;onOpen;onClose;onQR;onConnectionStatusChange;onReceiveMessages;static DEFAULT_COUNTRY_CODE="972";static CONNECTION_TIMEOUT="2s";static formatPhoneNumber(e,t=o.DEFAULT_COUNTRY_CODE){if(e.endsWith("@s.whatsapp.net"))return e;let n=e.replace(/[^0-9]/g,"");return n.startsWith("05")&&(n=n.substring(1)),n.startsWith(t)||(n=t+n),n}static formatPhoneNumberToWhatsappPattern(e,t=o.DEFAULT_COUNTRY_CODE){if(e.endsWith("@s.whatsapp.net"))return e;let n=o.formatPhoneNumber(e,t);return n=`${n}@s.whatsapp.net`,n}static getWhatsappPhoneLink({phone:e,message:t,countryCode:n=this.DEFAULT_COUNTRY_CODE}){let r=this.formatPhoneNumber(e,n),s={...t&&{text:encodeURI(t)}};return `https://wa.me/${r}?${s}`}static async qrToImage(e,t={}){return j__default.default.toDataURL(e,{errorCorrectionLevel:"H",width:400,margin:2,...t})}static async qrToTerminalString(e,t={}){return j__default.default.toString(e,{type:"terminal",small:true,...t})}static randomPairingCode(e,t=8){if(!e.includes("[")&&e.length===t)return e;let n="",r=[],s=c=>{let i=[];for(let g=0;g<c.length;g++)if(c[g+1]==="-"&&c[g+2]){let u=c.charCodeAt(g),m=c.charCodeAt(g+2);for(let l=u;l<=m;l++)i.push(String.fromCharCode(l));g+=2;}else i.push(c[g]);return i};for(let c=0;c<e.length&&n.length<t;c++){let i=e[c];if(i==="["){let g=e.indexOf("]",c),u=e.slice(c+1,g);r=s(u),c=g;}else n+=i;}for(;n.length<t&&r.length;)n+=r[Math.floor(Math.random()*r.length)];let a=n.toUpperCase();return a.padEnd(t,a)}constructor({fileAuthStateDirectoryPath:e,mongoURL:t,mongoCollection:n="whatsapp-auth",logger:r,onOpen:s,onClose:a,onQR:c,onReceiveMessages:i,onConnectionStatusChange:g,debug:u,printQRInTerminal:m,pairingPhone:l,customPairingCode:P,allowUseLastVersion:b=true}){this.mongoURL=t,this.fileAuthStateDirectoryPath=e,this.mongoCollection=n,this.logger=r,this.debug=u,this.printQRInTerminal=m,this.pairingPhone=l,this.customPairingCode=P,this.allowUseLastVersion=b,this.onConnectionStatusChange=g,this.socket=null,this.onReceiveMessages=i,this.onOpen=s,this.onClose=a,this.onQR=c;}async getAuthCollection(){if(!this.mongoURL)return [];let e=new mongodb.MongoClient(this.mongoURL);return await e.connect(),[e.db().collection(this.mongoCollection),e]}async authenticate(){if(!this.mongoURL&&!this.fileAuthStateDirectoryPath)throw new Error("fileAuthStateDirectoryPath/MongoURL is missing");if(!this.mongoURL){let{saveCreds:s,state:a}=await ee.useMultiFileAuthState(this.fileAuthStateDirectoryPath);return {auth:a,saveCreds:s}}let[e]=await this.getAuthCollection(),{state:t,saveCreds:n}=await O(e);return {auth:{creds:t.creds,keys:ee.makeCacheableSignalKeyStore(t.keys,E)},saveCreds:n}}async startConnection({options:e,connectionAttempts:t=3,onOpen:n=this.onOpen,onClose:r=this.onClose,onQR:s=this.onQR,onConnectionStatusChange:a=this.onConnectionStatusChange,pairingPhone:c,debug:i}={}){let g=c??this.pairingPhone,{saveCreds:u,auth:m}=await this.authenticate(),l=i===void 0?this.debug:i,{version:P,isLatest:b}=await ee.fetchLatestBaileysVersion();this.allowUseLastVersion&&!b&&l&&this.logger?.warn("WHATSAPP","current baileys service is not the latest version!",{version:P,isLatest:b});let D=async()=>new Promise(v=>{let h=ee__default.default({version:this.allowUseLastVersion?P:[2,3e3,1027934701],logger:E,browser:["Ubuntu","Chrome","20.0.04"],syncFullHistory:false,shouldSyncHistoryMessage:()=>false,shouldIgnoreJid:f=>f.includes("@newsletter"),...e,printQRInTerminal:false,auth:m});h.ev.on("connection.update",async f=>{let{connection:T,lastDisconnect:R,qr:C}=f;if(C){if(l&&this.logger?.info("WHATSAPP","QR Code received",{qr:C}),this.printQRInTerminal){let q=await o.qrToTerminalString(C,{small:true}).catch(()=>null);console.log(q);}this.customPairingCode?o.randomPairingCode(this.customPairingCode):void 0;let y=g?o.formatPhoneNumber(g):null,w=y?await h.requestPairingCode(y):null;l&&this.printQRInTerminal&&this.logger?.info("WHATSAPP","QR Pairing Code",{code:w,pairingPhone:y}),await s?.(C,w);}switch(T){case "connecting":{l&&this.logger?.debug("WHATSAPP","Connecting..."),a?.("connecting");break}case "open":{l&&this.logger?.info("WHATSAPP","Connection opened successfully!"),this.socket=h,await n?.(),a?.("open"),v(this.socket);break}case "close":{let W=t-- >0&&R?.error?.output?.statusCode!==ee.DisconnectReason.loggedOut,y=R?.error?.output?.statusCode,w=R?.error?.message;l&&this.logger?.info("WHATSAPP","Connection closed",{statusCode:y,errorMessage:w,shouldReconnect:W}),W&&t?(l&&this.logger?.info("WHATSAPP","Reconnecting..."),await H(o.CONNECTION_TIMEOUT),v(D())):(l&&this.logger?.warn("WHATSAPP","Logged out, clearing auth state"),await r?.(),this.socket=null,v(this.socket)),a?.("close");break}}}),h.ev.on("creds.update",u),this.onReceiveMessages&&typeof this.onReceiveMessages=="function"&&h.ev.on("messages.upsert",async({messages:f,type:T})=>{this.logger?.info("WHATSAPP","Received messages",{type:T,totalMessages:f.length}),this.onReceiveMessages?.(f,T);});});return await D()}async closeConnection(){this.socket&&(this.debug&&this.logger?.info("WHATSAPP","Closing connection"),this.socket.end(void 0),this.socket=null);}async clearAuthState(){if(this.mongoURL){let[e,t]=await this.getAuthCollection();this.debug&&this.logger?.info("WHATSAPP","Deleting auth state, required to scanning QR again"),await e?.deleteMany({}),await t?.close();}else this.fileAuthStateDirectoryPath&&re__default.default.rmSync(this.fileAuthStateDirectoryPath,{recursive:true,force:true});}async resetConnection({pairingPhone:e}={}){await this.closeConnection(),await this.clearAuthState(),await new Promise(t=>setTimeout(t,2e3)),await this.startConnection({pairingPhone:e});}isConnected(){return this.socket!==null&&this.socket.user!==void 0}};var k=class o extends S{static DEFAULT_COUNTRY_CODE="972";constructor(e){super(e);}async sendTextMessage(e,t,n){this.socket||(this.debug&&this.logger?.warn("WHATSAPP","Client not connected, attempting to connect..."),this.socket=await this.startConnection());let r=o.formatPhoneNumberToWhatsappPattern(e),s={...n&&{quoted:{key:{id:n}}}};return this.socket?.sendMessage(r,{text:t},s)}async sendButtonsMessage(e,{subtitle:t,title:n,buttons:r}){if(!n||!r.length)throw new Error("sendButtonsMessage: No title or buttons required field found.");this.socket||(this.debug&&this.logger?.warn("WHATSAPP","Client not connected, attempting to connect..."),this.socket=await this.startConnection());let s=o.formatPhoneNumberToWhatsappPattern(e),a=r?.map(i=>{let g={display_text:i.label},u;switch(true){case !!i.url:u="cta_url",g.url=i.url;break;case !!i.copy:u="cta_copy",g.copy_code=i.copy;break;case !!i.tel:u="cta_call",g.phone_number=i.tel;break;case !!i.email:u="cta_email",g.email=i.email;break;case !!(i.reminderOn||i.reminderDate):u="cta_reminder";let{reminderOn:m,reminderDate:l}=i;g.reminder_name=i.reminderName,g.reminder_timestamp=l?Math.floor(+new Date(l)/1e3):Math.floor(Date.now()/1e3)+N(m??"0s");break;default:u="";break}return {name:u,buttonParamsJson:JSON.stringify(g)}}).filter(i=>i.name),c=ee.generateWAMessageFromContent(s,{viewOnceMessage:{message:{interactiveMessage:ee.WAProto.Message.InteractiveMessage.create({...n&&{body:ee.WAProto.Message.InteractiveMessage.Body.create({text:n})},...t&&{footer:ee.WAProto.Message.InteractiveMessage.Footer.create({text:t})},...!!a?.length&&{nativeFlowMessage:ee.WAProto.Message.InteractiveMessage.NativeFlowMessage.create({buttons:a})}})}}},{userJid:s});return this.debug&&this.logger?.debug("WHATSAPP","send buttons message",{jid:s,footer:t,body:n,buttons:a}),this.socket?.relayMessage(s,c.message,{messageId:c.key.id})}async sendReplyButtonsMessage(e,{title:t,subtitle:n,buttons:r}){if(!t||!r.length)throw new Error("sendReplyButtonsMessage: No title or buttons required field found.");this.socket||(this.debug&&this.logger?.warn("WHATSAPP","Client not connected, attempting to connect..."),this.socket=await this.startConnection());let s=o.formatPhoneNumberToWhatsappPattern(e),a=r.filter(c=>c).map((c,i)=>({buttonId:`id${i}`,buttonText:{displayText:c},type:1}));return this.debug&&this.logger?.debug("WHATSAPP","send reply buttons message",{jid:s,text:t,footer:n,buttons:a}),this.socket?.sendMessage(s,{text:t,...n&&{footer:n},buttons:a})}};var B=class o extends k{static DEFAULT_COUNTRY_CODE="972";constructor(e){super(e);}async sendFileFromStream(e,t,n){this.socket||(this.debug&&this.logger?.warn("WHATSAPP","Client not connected, attempting to connect..."),this.socket=await this.startConnection());let r=o.formatPhoneNumberToWhatsappPattern(e),s=t instanceof Buffer?t:await this.streamToBuffer(t),a=n.mimetype||this.getMimetypeFromFilename(n.filename),c=await this.createFileMessage(s,a,n),i={...n.replyToMessageId&&{quoted:{key:{id:n.replyToMessageId}}}};return this.socket?.sendMessage(r,c,i)}async streamToBuffer(e){return new Promise((t,n)=>{let r=[];e.on("data",s=>r.push(Buffer.from(s))),e.on("error",s=>n(s)),e.on("end",()=>t(Buffer.concat(r)));})}getMimetypeFromFilename(e){let t=e.split(".").pop()?.toLowerCase();return {jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",gif:"image/gif",webp:"image/webp",bmp:"image/bmp",svg:"image/svg+xml",mp4:"video/mp4",avi:"video/x-msvideo",mov:"video/quicktime",mkv:"video/x-matroska",webm:"video/webm",mp3:"audio/mpeg",wav:"audio/wav",ogg:"audio/ogg",opus:"audio/opus",aac:"audio/aac",m4a:"audio/mp4",pdf:"application/pdf",doc:"application/msword",docx:"application/vnd.openxmlformats-officedocument.wordprocessingml.document",xls:"application/vnd.ms-excel",xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",ppt:"application/vnd.ms-powerpoint",pptx:"application/vnd.openxmlformats-officedocument.presentationml.presentation",txt:"text/plain",zip:"application/zip",rar:"application/x-rar-compressed","7z":"application/x-7z-compressed"}[t||""]||"application/octet-stream"}async createFileMessage(e,t,n){let[r]=t.split("/");switch(r){case "image":return {image:e,caption:n.caption,mimetype:t,fileName:n.filename};case "video":return {video:e,caption:n.caption,mimetype:t,fileName:n.filename,gifPlayback:n.gifPlayback||false,jpegThumbnail:n.jpegThumbnail,...n.seconds&&{seconds:n.seconds}};case "audio":return n.ptt?{audio:e,mimetype:"audio/ogg; codecs=opus",ptt:true,...n.seconds&&{seconds:n.seconds}}:{audio:e,mimetype:t,fileName:n.filename,...n.seconds&&{seconds:n.seconds}};default:return {document:e,mimetype:t,fileName:n.filename,caption:n.caption,jpegThumbnail:n.jpegThumbnail}}}async sendImage(e,t,n={}){return this.sendFileFromStream(e,t,{filename:n.filename||"image.jpg",caption:n.caption,replyToMessageId:n.replyToMessageId})}async sendVideo(e,t,n={}){return this.sendFileFromStream(e,t,{filename:n.filename||"video.mp4",caption:n.caption,gifPlayback:n.gifPlayback,replyToMessageId:n.replyToMessageId,jpegThumbnail:n.jpegThumbnail})}async sendAudio(e,t,n={}){return this.sendFileFromStream(e,t,{filename:n.filename||"audio.mp3",mimetype:n.ptt?"audio/ogg; codecs=opus":"",ptt:n.ptt,seconds:n.seconds,replyToMessageId:n.replyToMessageId})}async sendDocument(e,t,n){return this.sendFileFromStream(e,t,{filename:n.filename,mimetype:n.mimetype,caption:n.caption,replyToMessageId:n.replyToMessageId,jpegThumbnail:n.jpegThumbnail})}async sendVoiceNote(e,t,n={}){return this.sendAudio(e,t,{ptt:true,seconds:n.seconds,replyToMessageId:n.replyToMessageId})}async sendSticker(e,t,n={}){this.socket||(this.debug&&this.logger?.warn("WHATSAPP","Client not connected, attempting to connect..."),this.socket=await this.startConnection());let r=o.formatPhoneNumberToWhatsappPattern(e),s=t instanceof Buffer?t:await this.streamToBuffer(t),a={...n.replyToMessageId&&{quoted:{key:{id:n.replyToMessageId}}}};return this.socket?.sendMessage(r,{sticker:s},a)}};var M=class o extends B{static DEFAULT_COUNTRY_CODE="972";constructor(e){super(e);}async sendImageMessage(e,t,{caption:n="",filename:r}={}){this.socket||(this.debug&&this.logger?.warn("WHATSAPP","Client not connected, attempting to connect..."),this.socket=await this.startConnection());let s=o.formatPhoneNumberToWhatsappPattern(e),a=typeof t=="string"?await p(t):t;return this.debug&&this.logger?.debug("WHATSAPP","send image message",{jid:s,caption:n,filename:r}),await super.sendImage(s,a,{caption:n,...r&&{filename:r}})}async sendVideoMessage(e,t,{caption:n="",filename:r,sendAsGifPlayback:s=false}={}){this.socket||(this.debug&&this.logger?.warn("WHATSAPP","Client not connected, attempting to connect..."),this.socket=await this.startConnection());let a=o.formatPhoneNumberToWhatsappPattern(e),c=typeof t=="string"?await p(t):t;return this.debug&&this.logger?.debug("WHATSAPP","send video message",{jid:a,caption:n,filename:r,gifPlayback:s}),await super.sendVideo(a,c,{caption:n,gifPlayback:s,...r&&{filename:r}})}async sendFileMessage(e,t,{caption:n="",mimetype:r="application/vnd.openxmlformats-officedocument.wordprocessingml.document",replyToMessageId:s,jpegThumbnailSrc:a,filename:c}={}){this.socket||(this.debug&&this.logger?.warn("WHATSAPP","Client not connected, attempting to connect..."),this.socket=await this.startConnection());let i=o.formatPhoneNumberToWhatsappPattern(e),g=typeof t=="string"?await p(t):t,u;typeof a=="string"?u=await p(a):a instanceof re.ReadStream?u=await I(a):u=a;let m="mu-document";if(t instanceof re.ReadStream){let l=L(t);l&&(m=l);}else typeof t=="string"&&(m=path.basename(t));return this.debug&&this.logger?.debug("WHATSAPP","send file message",{jid:i,caption:n,mimetype:r,filename:m,replyToMessageId:s,includeJpegThumbnail:!!u}),await super.sendDocument(i,g,{caption:n,mimetype:r,filename:m,replyToMessageId:s,jpegThumbnail:u})}async sendAudioMessage(e,t,{filename:n,replyToMessageId:r,mimetype:s,seconds:a}={}){this.socket||(this.debug&&this.logger?.warn("WHATSAPP","Client not connected, attempting to connect..."),this.socket=await this.startConnection());let c=o.formatPhoneNumberToWhatsappPattern(e),i=typeof t=="string"?await p(t):t,g=a||await F(i,s).catch(()=>0);return this.debug&&this.logger?.debug("WHATSAPP","send audio message",{jid:c,mimetype:s,filename:n,seconds:g,replyToMessageId:r}),await super.sendAudio(c,i,{...n&&{filename:n},...s&&{mimetype:s},...g&&{seconds:g},...r&&{replyToMessageId:r}})}async sendStickerMessage(e,t,{replyToMessageId:n}={}){this.socket||(this.debug&&this.logger?.warn("WHATSAPP","Client not connected, attempting to connect..."),this.socket=await this.startConnection());let r=o.formatPhoneNumberToWhatsappPattern(e),s=typeof t=="string"?await p(t):t;this.debug&&this.logger?.debug("WHATSAPP","send sticker message",{jid:r,replyToMessageId:n}),await super.sendSticker(r,s,{replyToMessageId:n});}};var _=class extends M{constructor(e){super(e);}};
2
- exports.WhatsappSocket=_;//# sourceMappingURL=index.cjs.map
1
+ 'use strict';var re=require('fs'),te=require('@fadzzzslebew/baileys'),I=require('ms'),H=require('qrcode'),mongodb=require('mongodb'),ie=require('pino'),musicMetadata=require('music-metadata'),path=require('path');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var re__default=/*#__PURE__*/_interopDefault(re);var te__default=/*#__PURE__*/_interopDefault(te);var I__default=/*#__PURE__*/_interopDefault(I);var H__default=/*#__PURE__*/_interopDefault(H);var ie__default=/*#__PURE__*/_interopDefault(ie);var D={replacer:(o,e)=>Buffer.isBuffer(e)||e instanceof Uint8Array||e?.type==="Buffer"?{type:"Buffer",data:Buffer.from(e?.data||e).toString("base64")}:e,reviver:(o,e)=>{if(typeof e=="object"&&e&&(e.buffer===true||e.type==="Buffer")){let t=e.data||e.value;return typeof t=="string"?Buffer.from(t,"base64"):Buffer.from(t||[])}return e}},Y=async o=>{let e=(s,a)=>{let i={$set:{...JSON.parse(JSON.stringify(s,D.replacer))}};return o.updateOne({_id:a},i,{upsert:true})},t=async s=>{try{let a=JSON.stringify(await o.findOne({_id:s}));return JSON.parse(a,D.reviver)}catch{return null}},n=async s=>{try{await o.deleteOne({_id:s});}catch{}},r=await t("creds")||te.initAuthCreds();return {state:{creds:r,keys:{get:async(s,a)=>{let c={};return await Promise.all(a.map(async i=>{let g=await t(`${s}-${i}`);s==="app-state-sync-key"&&g&&(g=te.WAProto.Message.AppStateSyncKeyData.fromObject(g)),c[i]=g;})),c},set:async s=>{let a=[];for(let c of Object.keys(s))for(let i of Object.keys(s[c])){let g=s[c][i],u=`${c}-${i}`;a.push(g?e(g,u):n(u));}await Promise.all(a);}}},saveCreds:()=>e(r,"creds")}},O=Y;var F=o=>I__default.default(o)/1e3;async function p(o){let t=await(await fetch(o)).arrayBuffer();return Buffer.from(t)}async function Z(o,e){try{let t=await musicMetadata.parseStream(o,{mimeType:e||"audio/mpeg"});return Math.floor(t.format.duration||0)}catch(t){throw console.error("Error parsing stream:",t),t}finally{o.destroyed||o.destroy();}}async function ee(o,e){try{let t=await musicMetadata.parseBuffer(o,e||"audio/mpeg").catch(()=>null);return t?Math.floor(t.format.duration||0):0}catch(t){throw console.error("Error parsing buffer:",t),t}}async function U(o,e){return o instanceof re.ReadStream?Z(o,e):ee(o,e)}async function E(o){let e=[];for await(let t of o)e.push(t);return Buffer.concat(e)}function L(o){if(o.path){let e=o.path.toString();return path.basename(e)}}var C=o=>new Promise(e=>setTimeout(e,I__default.default(o))),j={jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",gif:"image/gif",webp:"image/webp",bmp:"image/bmp",svg:"image/svg+xml",mp4:"video/mp4",avi:"video/x-msvideo",mov:"video/quicktime",mkv:"video/x-matroska",webm:"video/webm",mp3:"audio/mpeg",wav:"audio/wav",ogg:"audio/ogg",opus:"audio/opus",aac:"audio/aac",m4a:"audio/mp4",pdf:"application/pdf",doc:"application/msword",docx:"application/vnd.openxmlformats-officedocument.wordprocessingml.document",xls:"application/vnd.ms-excel",xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",ppt:"application/vnd.ms-powerpoint",pptx:"application/vnd.openxmlformats-officedocument.presentationml.presentation",txt:"text/plain",zip:"application/zip",rar:"application/x-rar-compressed","7z":"application/x-7z-compressed"};var _=ie__default.default({level:"silent"}),M=class o{socket;fileAuthStateDirectoryPath;mongoURL;mongoCollection="whatsapp-auth";logger;debug;printQRInTerminal;pairingPhone;customPairingCode;appName;onPreConnectionSendMessageFailed;onOpen;onClose;onQR;onConnectionStatusChange;onReceiveMessages;static DEFAULT_COUNTRY_CODE="972";static CONNECTION_TIMEOUT="2s";static formatPhoneNumber(e,t=o.DEFAULT_COUNTRY_CODE){if(e.endsWith("@s.whatsapp.net"))return e;let n=e.replace(/[^0-9]/g,"");return n.startsWith("05")&&(n=n.substring(1)),n.startsWith(t)||(n=t+n),n}static formatPhoneNumberToWhatsappPattern(e,t=o.DEFAULT_COUNTRY_CODE){if(e.endsWith("@s.whatsapp.net"))return e;let n=o.formatPhoneNumber(e,t);return n=`${n}@s.whatsapp.net`,n}static getWhatsappPhoneLink({phone:e,message:t,countryCode:n=this.DEFAULT_COUNTRY_CODE}){let r=this.formatPhoneNumber(e,n),s={...t&&{text:encodeURI(t)}};return `https://wa.me/${r}?${s}`}static async qrToImage(e,t={}){return H__default.default.toDataURL(e,{errorCorrectionLevel:"H",width:400,margin:2,...t})}static async qrToTerminalString(e,t={}){return H__default.default.toString(e,{type:"terminal",small:true,...t})}static randomPairingCode(e,t=8){if(!e.includes("[")&&e.length===t)return e;let n="",r=[],s=c=>{let i=[];for(let g=0;g<c.length;g++)if(c[g+1]==="-"&&c[g+2]){let u=c.charCodeAt(g),d=c.charCodeAt(g+2);for(let m=u;m<=d;m++)i.push(String.fromCharCode(m));g+=2;}else i.push(c[g]);return i};for(let c=0;c<e.length&&n.length<t;c++){let i=e[c];if(i==="["){let g=e.indexOf("]",c),u=e.slice(c+1,g);r=s(u),c=g;}else n+=i;}for(;n.length<t&&r.length;)n+=r[Math.floor(Math.random()*r.length)];let a=n.toUpperCase();return a.padEnd(t,a)}constructor({fileAuthStateDirectoryPath:e,mongoURL:t,mongoCollection:n="whatsapp-auth",logger:r,onOpen:s,onClose:a,onQR:c,onReceiveMessages:i,onConnectionStatusChange:g,debug:u,printQRInTerminal:d,pairingPhone:m,customPairingCode:v,onPreConnectionSendMessageFailed:P,appName:R}){this.appName=R,this.mongoURL=t,this.fileAuthStateDirectoryPath=e,this.mongoCollection=n,this.logger=r,this.debug=u,this.printQRInTerminal=d,this.pairingPhone=m,this.customPairingCode=v,this.socket=null,this.onPreConnectionSendMessageFailed=P,this.onConnectionStatusChange=g,this.onReceiveMessages=i,this.onOpen=s,this.onClose=a,this.onQR=c;}async getLatestWhatsAppVersion(){try{let e=["https://raw.githubusercontent.com/WhiskeySockets/Baileys/master/src/Defaults/baileys-version.json","https://raw.githubusercontent.com/whiskeysockets/baileys/master/src/Defaults/baileys-version.json"];for(let t of e)try{let n=await fetch(t);if(n.ok)return (await n.json()).version}catch{continue}return console.log("Could not fetch version, using fallback"),[2,3e3,1015901307]}catch(e){return console.error("Error fetching version:",e),[2,3e3,1015901307]}}async getAuthCollection(){if(!this.mongoURL)return [];let e=new mongodb.MongoClient(this.mongoURL);return await e.connect(),[e.db().collection(this.mongoCollection),e]}async authenticate(){if(!this.mongoURL&&!this.fileAuthStateDirectoryPath)throw new Error("fileAuthStateDirectoryPath/MongoURL is missing");if(!this.mongoURL){let{saveCreds:s,state:a}=await te.useMultiFileAuthState(this.fileAuthStateDirectoryPath);return {auth:a,saveCreds:s}}let[e]=await this.getAuthCollection(),{state:t,saveCreds:n}=await O(e);return {auth:{creds:t.creds,keys:te.makeCacheableSignalKeyStore(t.keys,_)},saveCreds:n}}async startConnection({options:e,connectionAttempts:t=3,onOpen:n=this.onOpen,onClose:r=this.onClose,onQR:s=this.onQR,onConnectionStatusChange:a=this.onConnectionStatusChange,pairingPhone:c,debug:i}={}){let g=c??this.pairingPhone,{saveCreds:u,auth:d}=await this.authenticate(),m=i===void 0?this.debug:i,v=await this.getLatestWhatsAppVersion(),P=async()=>new Promise(W=>{let h=te__default.default({version:v,logger:_,browser:[this.appName||"baileys","1.0.0",""],syncFullHistory:false,shouldSyncHistoryMessage:()=>false,shouldIgnoreJid:f=>f.includes("@newsletter"),...e,printQRInTerminal:false,auth:d});h.ev.on("connection.update",async f=>{let{connection:b,lastDisconnect:N,qr:S}=f;if(S){if(m&&this.logger?.info("WHATSAPP","QR Code received",{qr:S}),this.printQRInTerminal){let Q=await o.qrToTerminalString(S,{small:true}).catch(()=>null);console.log(Q);}this.customPairingCode?o.randomPairingCode(this.customPairingCode):void 0;let y=g?o.formatPhoneNumber(g):null,T=y?await h.requestPairingCode(y):null;m&&this.printQRInTerminal&&this.logger?.info("WHATSAPP","QR Pairing Code",{code:T,pairingPhone:y}),await s?.(S,T);}switch(b){case "connecting":{m&&this.logger?.debug("WHATSAPP","Connecting..."),a?.("connecting");break}case "open":{m&&this.logger?.info("WHATSAPP","Connection opened successfully!"),this.socket=h,await n?.(),a?.("open"),W(this.socket);break}case "close":{let x=t-- >0&&N?.error?.output?.statusCode!==te.DisconnectReason.loggedOut,y=N?.error?.output?.statusCode,T=N?.error?.message;m&&this.logger?.info("WHATSAPP","Connection closed",{statusCode:y,errorMessage:T,shouldReconnect:x}),x&&t?(m&&this.logger?.info("WHATSAPP","Reconnecting..."),await C(o.CONNECTION_TIMEOUT),W(P())):(m&&this.logger?.warn("WHATSAPP","Logged out, clearing auth state"),await r?.(),this.socket=null,W(this.socket)),a?.("close");break}}}),h.ev.on("creds.update",u),this.onReceiveMessages&&typeof this.onReceiveMessages=="function"&&h.ev.on("messages.upsert",async({messages:f,type:b})=>{this.logger?.info("WHATSAPP","Received messages",{type:b,totalMessages:f.length}),this.onReceiveMessages?.(f,b);});}),R=await P();return await C(o.CONNECTION_TIMEOUT),R}async ensureSocketConnected(){return this.socket||(this.debug&&this.logger?.warn("WHATSAPP","Client not connected, attempting to connect..."),this.socket=await this.startConnection().catch(e=>(this.onPreConnectionSendMessageFailed?.(e),null))),this.socket}async closeConnection(){this.socket&&(this.debug&&this.logger?.info("WHATSAPP","Closing connection"),this.socket.end(void 0),this.socket=null);}async clearAuthState(){if(await this.closeConnection(),this.mongoURL){let[e,t]=await this.getAuthCollection();this.debug&&this.logger?.info("WHATSAPP","Deleting auth state, required to scanning QR again"),await e?.deleteMany({}),await t?.close();}else this.fileAuthStateDirectoryPath&&re__default.default.rmSync(this.fileAuthStateDirectoryPath,{recursive:true,force:true});}async resetConnection({pairingPhone:e,autoConnect:t=true}={}){await this.clearAuthState(),t&&(await C(o.CONNECTION_TIMEOUT),await this.startConnection({pairingPhone:e}));}isConnected(){return this.socket!==null&&this.socket.user!==void 0}};var k=class o extends M{static DEFAULT_COUNTRY_CODE="972";constructor(e){super(e);}async sendTextMessage(e,t,n){await this.ensureSocketConnected();let r=o.formatPhoneNumberToWhatsappPattern(e),s={...n&&{quoted:{key:{id:n}}}};return this.socket?.sendMessage(r,{text:t},s)}async sendButtonsMessage(e,{subtitle:t,title:n,buttons:r}){if(!n||!r.length)throw new Error("sendButtonsMessage: No title or buttons required field found.");await this.ensureSocketConnected();let s=o.formatPhoneNumberToWhatsappPattern(e),a=r?.map(i=>{let g={display_text:i.label},u;switch(true){case !!i.url:u="cta_url",g.url=i.url;break;case !!i.copy:u="cta_copy",g.copy_code=i.copy;break;case !!i.tel:u="cta_call",g.phone_number=i.tel;break;case !!i.email:u="cta_email",g.email=i.email;break;case !!(i.reminderOn||i.reminderDate):u="cta_reminder";let{reminderOn:d,reminderDate:m}=i;g.reminder_name=i.reminderName,g.reminder_timestamp=m?Math.floor(+new Date(m)/1e3):Math.floor(Date.now()/1e3)+F(d??"0s");break;default:u="";break}return {name:u,buttonParamsJson:JSON.stringify(g)}}).filter(i=>i.name),c=te.generateWAMessageFromContent(s,{viewOnceMessage:{message:{interactiveMessage:te.WAProto.Message.InteractiveMessage.create({...n&&{body:te.WAProto.Message.InteractiveMessage.Body.create({text:n})},...t&&{footer:te.WAProto.Message.InteractiveMessage.Footer.create({text:t})},...!!a?.length&&{nativeFlowMessage:te.WAProto.Message.InteractiveMessage.NativeFlowMessage.create({buttons:a})}})}}},{userJid:s});return this.debug&&this.logger?.debug("WHATSAPP","send buttons message",{jid:s,footer:t,body:n,buttons:a}),this.socket?.relayMessage(s,c.message,{messageId:c.key.id})}async sendReplyButtonsMessage(e,{title:t,subtitle:n,buttons:r}){if(!t||!r.length)throw new Error("sendReplyButtonsMessage: No title or buttons required field found.");await this.ensureSocketConnected();let s=o.formatPhoneNumberToWhatsappPattern(e),a=r.filter(c=>c).map((c,i)=>typeof c=="string"?{buttonId:`id-${i}`,buttonText:{displayText:c},type:1}:{buttonId:`${c.id}`,buttonText:{displayText:c.label},type:1});return this.debug&&this.logger?.debug("WHATSAPP","send reply buttons message",{jid:s,text:t,footer:n,buttons:a}),this.socket?.sendMessage(s,{text:t,...n&&{footer:n},buttons:a})}};var B=class o extends k{constructor(e){super(e);}async sendFileFromStream(e,t,n){await this.ensureSocketConnected();let r=o.formatPhoneNumberToWhatsappPattern(e),s=t instanceof Buffer?t:await this.streamToBuffer(t),a=n.mimetype||this.getMimetypeFromFilename(n.filename),c=await this.createFileMessage(s,a,n),i={...n.replyToMessageId&&{quoted:{key:{id:n.replyToMessageId}}}};return this.socket?.sendMessage(r,c,i)}async streamToBuffer(e){return new Promise((t,n)=>{let r=[];e.on("data",s=>r.push(Buffer.from(s))),e.on("error",s=>n(s)),e.on("end",()=>t(Buffer.concat(r)));})}getMimetypeFromFilename(e){let t=e.split(".").pop()?.toLowerCase();return j[t||""]||"application/octet-stream"}async createFileMessage(e,t,n){let[r]=t.split("/");switch(r){case "image":return {image:e,caption:n.caption,mimetype:t,fileName:n.filename};case "video":return {video:e,caption:n.caption,mimetype:t,fileName:n.filename,gifPlayback:n.gifPlayback||false,jpegThumbnail:n.jpegThumbnail,...n.seconds&&{seconds:n.seconds}};case "audio":return n.ptt?{audio:e,mimetype:"audio/ogg; codecs=opus",ptt:true,...n.seconds&&{seconds:n.seconds}}:{audio:e,mimetype:t,fileName:n.filename,...n.seconds&&{seconds:n.seconds}};default:return {document:e,mimetype:t,fileName:n.filename,caption:n.caption,jpegThumbnail:n.jpegThumbnail}}}async sendImage(e,t,n={}){return this.sendFileFromStream(e,t,{filename:n.filename||"image.jpg",caption:n.caption,replyToMessageId:n.replyToMessageId})}async sendVideo(e,t,n={}){return this.sendFileFromStream(e,t,{filename:n.filename||"video.mp4",caption:n.caption,gifPlayback:n.gifPlayback,replyToMessageId:n.replyToMessageId,jpegThumbnail:n.jpegThumbnail})}async sendAudio(e,t,n={}){return this.sendFileFromStream(e,t,{filename:n.filename||"audio.mp3",mimetype:n.ptt?"audio/ogg; codecs=opus":"",ptt:n.ptt,seconds:n.seconds,replyToMessageId:n.replyToMessageId})}async sendDocument(e,t,n){return this.sendFileFromStream(e,t,{filename:n.filename,mimetype:n.mimetype,caption:n.caption,replyToMessageId:n.replyToMessageId,jpegThumbnail:n.jpegThumbnail})}async sendVoiceNote(e,t,n={}){return this.sendAudio(e,t,{ptt:true,seconds:n.seconds,replyToMessageId:n.replyToMessageId})}async sendSticker(e,t,n={}){await this.ensureSocketConnected();let r=o.formatPhoneNumberToWhatsappPattern(e),s=t instanceof Buffer?t:await this.streamToBuffer(t),a={...n.replyToMessageId&&{quoted:{key:{id:n.replyToMessageId}}}};return this.socket?.sendMessage(r,{sticker:s},a)}};var A=class o extends B{static DEFAULT_COUNTRY_CODE="972";constructor(e){super(e);}async sendImageMessage(e,t,{caption:n="",filename:r}={}){await this.ensureSocketConnected();let s=o.formatPhoneNumberToWhatsappPattern(e),a=typeof t=="string"?await p(t):t;return this.debug&&this.logger?.debug("WHATSAPP","send image message",{jid:s,caption:n,filename:r}),await this.sendImage(s,a,{caption:n,...r&&{filename:r}})}async sendVideoMessage(e,t,{caption:n="",filename:r,sendAsGifPlayback:s=false}={}){await this.ensureSocketConnected();let a=o.formatPhoneNumberToWhatsappPattern(e),c=typeof t=="string"?await p(t):t;return this.debug&&this.logger?.debug("WHATSAPP","send video message",{jid:a,caption:n,filename:r,gifPlayback:s}),await this.sendVideo(a,c,{caption:n,gifPlayback:s,...r&&{filename:r}})}async sendFileMessage(e,t,{caption:n="",mimetype:r="application/vnd.openxmlformats-officedocument.wordprocessingml.document",replyToMessageId:s,jpegThumbnailSrc:a,filename:c}={}){await this.ensureSocketConnected();let i=o.formatPhoneNumberToWhatsappPattern(e),g=typeof t=="string"?await p(t):t,u;typeof a=="string"?u=await p(a):a instanceof re.ReadStream?u=await E(a):u=a;let d="mu-document";if(t instanceof re.ReadStream){let m=L(t);m&&(d=m);}else typeof t=="string"&&(d=path.basename(t));return this.debug&&this.logger?.debug("WHATSAPP","send file message",{jid:i,caption:n,mimetype:r,filename:d,replyToMessageId:s,includeJpegThumbnail:!!u}),await this.sendDocument(i,g,{caption:n,mimetype:r,filename:d,replyToMessageId:s,jpegThumbnail:u})}async sendAudioMessage(e,t,{filename:n,replyToMessageId:r,mimetype:s,seconds:a}={}){await this.ensureSocketConnected();let c=o.formatPhoneNumberToWhatsappPattern(e),i=typeof t=="string"?await p(t):t,g=a||await U(i,s).catch(()=>0);return this.debug&&this.logger?.debug("WHATSAPP","send audio message",{jid:c,mimetype:s,filename:n,seconds:g,replyToMessageId:r}),await this.sendAudio(c,i,{...n&&{filename:n},...s&&{mimetype:s},...g&&{seconds:g},...r&&{replyToMessageId:r}})}async sendStickerMessage(e,t,{replyToMessageId:n}={}){await this.ensureSocketConnected();let r=o.formatPhoneNumberToWhatsappPattern(e),s=typeof t=="string"?await p(t):t;this.debug&&this.logger?.debug("WHATSAPP","send sticker message",{jid:r,replyToMessageId:n}),await this.sendSticker(r,s,{replyToMessageId:n});}};var V=class extends A{constructor(e){super(e);}};
2
+ exports.WhatsappSocket=V;//# sourceMappingURL=index.cjs.map
3
3
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/mongoAuthState.ts","../src/helpers.ts","../src/whatsappSocket.base.ts","../src/whatsappSocket.messages.ts","../src/whatsappSocket.stream.ts","../src/whatsappSocket.files.ts","../src/whatsappSocket.client.ts"],"names":["BufferJSON","_k","value","_","val","useMongoDBAuthState","collection","writeData","data","id","update","readData","removeData","creds","initAuthCreds","type","ids","proto","tasks","category","key","mongoAuthState_default","getTotalSeconds","msValue","ms","getUrlBuffer","url","arrayBuffer","getDurationFromStream","stream","mimeType","metadata","parseStream","error","getDurationFromBuffer","buffer","parseBuffer","getAudioFileDuration","audioFile","ReadStream","streamToBuffer","chunks","chunk","getFilenameFromStream","pathStr","basename","sleep","timeout","resolve","pinoLogger","P","WhatsappSocketBase","_WhatsappSocketBase","phone","countryCode","strNumber","message","formattedPhone","query","qr","options","QRCode","pattern","length","result","pool","buildPool","block","chars","i","start","end","c","char","upperCaseResult","fileAuthStateDirectoryPath","mongoURL","mongoCollection","logger","onOpen","onClose","onQR","onReceiveMessages","onConnectionStatusChange","debug","printQRInTerminal","pairingPhone","customPairingCode","allowUseLastVersion","mongoClient","MongoClient","saveCreds","state","useMultiFileAuthState","makeCacheableSignalKeyStore","connectionAttempts","_pairingPhone","_debug","auth","version","isLatest","fetchLatestBaileysVersion","connect","sock","makeWASocket","jid","connection","lastDisconnect","qrcode","pairing","code","shouldReconnect","DisconnectReason","statusCode","errorMessage","messages","fs","WhatsappSocketMessages","_WhatsappSocketMessages","props","to","text","replyToMessageId","subtitle","title","buttons","buttonsValue","btn","buttonParamsJson","name","reminderOn","reminderDate","v","msg","generateWAMessageFromContent","displayText","index","WhatsappSocketStream","_WhatsappSocketStream","mimetype","messageContent","messageOptions","reject","err","filename","ext","imageBuffer","videoBuffer","audioBuffer","documentBuffer","stickerBuffer","WhatsappSocketFiles","_WhatsappSocketFiles","imageSrc","caption","imageData","videoSrc","gifPlayback","fileSrc","jpegThumbnailSrc","_filename","fileBuffer","jpegThumbnailBuffer","fname","audioSrc","seconds","durationInSeconds","WhatsappSocket"],"mappings":"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","file":"index.cjs","sourcesContent":["import {\n type AuthenticationCreds,\n type SignalDataTypeMap,\n initAuthCreds,\n WAProto as proto,\n} from '@fadzzzslebew/baileys';\n\nconst BufferJSON = {\n replacer: (_k: string, value: any) => {\n if (Buffer.isBuffer(value) || value instanceof Uint8Array || value?.type === 'Buffer') {\n return {\n type: 'Buffer',\n data: Buffer.from(value?.data || value).toString('base64'),\n };\n }\n return value;\n },\n\n reviver: (_: string, value: any) => {\n if (typeof value === 'object' && !!value && (value.buffer === true || value.type === 'Buffer')) {\n const val = value.data || value.value;\n return typeof val === 'string' ? Buffer.from(val, 'base64') : Buffer.from(val || []);\n }\n return value;\n },\n};\n\nconst useMongoDBAuthState = async (collection: any) => {\n const writeData = (data: any, id: string) => {\n const informationToStore = JSON.parse(JSON.stringify(data, BufferJSON.replacer));\n const update = { $set: { ...informationToStore } };\n return collection.updateOne({ _id: id }, update, { upsert: true });\n };\n\n const readData = async (id: string) => {\n try {\n const data = JSON.stringify(await collection.findOne({ _id: id }));\n return JSON.parse(data, BufferJSON.reviver);\n } catch (error) {\n return null;\n }\n };\n\n const removeData = async (id: string) => {\n try {\n await collection.deleteOne({ _id: id });\n } catch (_a) {}\n };\n\n const creds: AuthenticationCreds = (await readData('creds')) || initAuthCreds();\n\n return {\n state: {\n creds,\n keys: {\n get: async (type: keyof SignalDataTypeMap, ids: string[]) => {\n const data: { [id: string]: any } = {};\n await Promise.all(\n ids.map(async (id) => {\n let value = await readData(`${type}-${id}`);\n if (type === 'app-state-sync-key' && value) {\n value = proto.Message.AppStateSyncKeyData.fromObject(value);\n }\n data[id] = value;\n })\n );\n return data;\n },\n set: async (data: any) => {\n const tasks: Promise<any>[] = [];\n for (const category of Object.keys(data)) {\n for (const id of Object.keys(data[category])) {\n const value = data[category][id];\n const key = `${category}-${id}`;\n tasks.push(value ? writeData(value, key) : removeData(key));\n }\n }\n await Promise.all(tasks);\n },\n },\n },\n saveCreds: () => {\n return writeData(creds, 'creds');\n },\n };\n};\n\nexport default useMongoDBAuthState;\n","import ms, { type StringValue } from 'ms';\nimport { parseBuffer, parseStream } from 'music-metadata';\nimport { ReadStream } from 'node:fs';\nimport { basename } from 'node:path';\n\nexport const getTotalSeconds = (msValue: StringValue) => {\n const value = ms(msValue);\n return value / 1000;\n};\n\nexport async function getUrlBuffer(url: string) {\n const response = await fetch(url);\n const arrayBuffer = await response.arrayBuffer();\n const buffer = Buffer.from(arrayBuffer);\n return buffer;\n}\n\nasync function getDurationFromStream(stream: ReadStream, mimeType?: string): Promise<number> {\n try {\n const metadata = await parseStream(stream, { mimeType: mimeType || 'audio/mpeg' });\n return Math.floor(metadata.format.duration || 0);\n } catch (error) {\n console.error('Error parsing stream:', error);\n throw error;\n } finally {\n if (!stream.destroyed) {\n stream.destroy();\n }\n }\n}\nasync function getDurationFromBuffer(buffer: Buffer, mimeType?: string): Promise<number> {\n try {\n const metadata = await parseBuffer(buffer, mimeType || 'audio/mpeg').catch(() => null);\n return metadata ? Math.floor(metadata.format.duration || 0) : 0;\n } catch (error) {\n console.error('Error parsing buffer:', error);\n throw error;\n }\n}\n\nexport async function getAudioFileDuration(audioFile: ReadStream | Buffer, mimeType?: string): Promise<number> {\n if (audioFile instanceof ReadStream) {\n return getDurationFromStream(audioFile, mimeType);\n } else {\n return getDurationFromBuffer(audioFile, mimeType);\n }\n}\n\nexport async function streamToBuffer(stream: ReadStream): Promise<Buffer> {\n const chunks: Buffer[] = [];\n\n for await (const chunk of stream) {\n chunks.push(chunk);\n }\n\n return Buffer.concat(chunks);\n}\n\nexport function getFilenameFromStream(stream: ReadStream): string | undefined {\n if (stream.path) {\n const pathStr = stream.path.toString();\n return basename(pathStr);\n }\n return undefined;\n}\n\nexport const sleep = (timeout: StringValue | number) => {\n return new Promise((resolve) => setTimeout(resolve, typeof timeout === 'number' ? timeout : ms(timeout)));\n};\n","// Baileys links\n// https://whiskeysockets.github.io/docs/tutorial-basics/sending-messages\n// https://github.com/WhiskeySockets/Baileys\n// https://github.com/ndalu-id/baileys-api\n// https://whiskeysockets.github.io/Baileys/\n// alternatives:\n// https://www.npmjs.com/package/mudslide\n// https://www.npmjs.com/package/whatsapp-web.js\n// https://www.npmjs.com/package/wbm\nimport {\n default as makeWASocket,\n DisconnectReason,\n fetchLatestBaileysVersion,\n makeCacheableSignalKeyStore,\n type MessageUpsertType,\n type UserFacingSocketConfig,\n type WAMessage,\n type WASocket,\n useMultiFileAuthState,\n type AuthenticationState,\n} from '@fadzzzslebew/baileys';\nimport { type StringValue } from 'ms';\nimport type { Logger as MyLogger } from 'stack-trace-logger';\nimport fs from 'node:fs';\nimport QRCode from 'qrcode';\nimport { type Collection, type Document as MongoDocument, MongoClient } from 'mongodb';\nimport P from 'pino';\nimport type { Boom } from '@hapi/boom';\nimport useMongoDBAuthState from './mongoAuthState.ts';\nimport { sleep } from './helpers.ts';\n\nconst pinoLogger: any = P({ level: 'silent' });\n\nexport type WhatsappSocketBaseProps = (\n | { mongoURL: string; fileAuthStateDirectoryPath?: string }\n | { mongoURL?: string; fileAuthStateDirectoryPath: string }\n) & {\n logger?: any;\n mongoCollection?: string;\n onOpen?: () => Promise<void> | void;\n onClose?: () => Promise<void> | void;\n onConnectionStatusChange?: (connectionStatus: 'connecting' | 'close' | 'open') => Promise<void> | void;\n onReceiveMessages?: (messages: WAMessage[], type: MessageUpsertType) => Promise<void> | void;\n onQR?: (qr: string, code?: string | null) => Promise<void> | void;\n debug?: boolean;\n printQRInTerminal?: boolean;\n pairingPhone?: string;\n customPairingCode?: string;\n allowUseLastVersion?: boolean;\n};\n\nexport class WhatsappSocketBase {\n protected socket: null | WASocket;\n protected readonly fileAuthStateDirectoryPath?: string;\n protected readonly mongoURL?: string;\n protected readonly mongoCollection: string = 'whatsapp-auth';\n protected readonly logger?: MyLogger;\n protected readonly debug?: boolean;\n protected readonly printQRInTerminal?: boolean;\n protected readonly pairingPhone?: string;\n protected readonly customPairingCode?: string;\n protected readonly allowUseLastVersion?: boolean;\n private onOpen?: () => Promise<void> | void;\n private onClose?: () => Promise<void> | void;\n private onQR?: (qr: string, code?: string | null) => Promise<void> | void;\n private onConnectionStatusChange?: (connectionStatus: 'open' | 'close' | 'connecting') => Promise<void> | void;\n private readonly onReceiveMessages?: (messages: WAMessage[], type: MessageUpsertType) => Promise<void> | void;\n static DEFAULT_COUNTRY_CODE: string = '972';\n static CONNECTION_TIMEOUT: StringValue = '2s';\n\n static formatPhoneNumber(phone: string, countryCode: string = WhatsappSocketBase.DEFAULT_COUNTRY_CODE): string {\n if (phone.endsWith('@s.whatsapp.net')) return phone;\n\n let strNumber = phone.replace(/[^0-9]/g, '');\n if (strNumber.startsWith('05')) strNumber = strNumber.substring(1);\n if (!strNumber.startsWith(countryCode)) strNumber = countryCode + strNumber;\n\n return strNumber; // formatted Number should look like: '+972 051-333-4444' to: '972513334444'\n }\n\n static formatPhoneNumberToWhatsappPattern(\n phone: string,\n countryCode: string = WhatsappSocketBase.DEFAULT_COUNTRY_CODE\n ): string {\n if (phone.endsWith('@s.whatsapp.net')) return phone;\n\n let strNumber = WhatsappSocketBase.formatPhoneNumber(phone, countryCode);\n strNumber = `${strNumber}@s.whatsapp.net`; // formatted Number should look like: '972513334444@s.whatsapp.net'\n return strNumber;\n }\n\n static getWhatsappPhoneLink({\n phone,\n message,\n countryCode = this.DEFAULT_COUNTRY_CODE,\n }: {\n phone: string;\n countryCode?: string;\n message?: string;\n }) {\n const formattedPhone = this.formatPhoneNumber(phone, countryCode);\n const query = { ...(message && { text: encodeURI(message) }) };\n return `https://wa.me/${formattedPhone}?${query}`;\n }\n\n static async qrToImage(\n qr: string,\n options: {\n errorCorrectionLevel?: 'H' | 'L' | 'M';\n width?: number;\n margin?: number;\n [key: string]: any;\n } = {}\n ) {\n return QRCode.toDataURL(qr, {\n errorCorrectionLevel: 'H', // Changed to 'H' (High) for better reliability\n width: 400, // Increased size for better scanning\n margin: 2, // Ensure adequate margin\n ...options,\n });\n }\n\n static async qrToTerminalString(\n qr: string,\n options: {\n small?: boolean;\n [key: string]: any;\n } = {}\n ) {\n return QRCode.toString(qr, { type: 'terminal', small: true, ...options });\n }\n\n // only 8 alphanumeric (no more or less), patterns [a-z0-8] | aaaa[0-8] xxzzvvcc [zaq0-8]\n static randomPairingCode(pattern: string, length = 8) {\n // no randomness needed\n if (!pattern.includes('[') && pattern.length === length) {\n return pattern;\n }\n\n let result = '';\n let pool: string[] = [];\n\n const buildPool = (block: string) => {\n const chars: string[] = [];\n\n for (let i = 0; i < block.length; i++) {\n if (block[i + 1] === '-' && block[i + 2]) {\n const start = block.charCodeAt(i);\n const end = block.charCodeAt(i + 2);\n\n for (let c = start; c <= end; c++) {\n chars.push(String.fromCharCode(c));\n }\n\n i += 2;\n } else {\n chars.push(block[i]);\n }\n }\n\n return chars;\n };\n\n for (let i = 0; i < pattern.length && result.length < length; i++) {\n const char = pattern[i];\n\n if (char === '[') {\n const end = pattern.indexOf(']', i);\n const block = pattern.slice(i + 1, end);\n\n pool = buildPool(block);\n i = end;\n } else {\n result += char;\n }\n }\n\n // fill remaining from pool\n while (result.length < length && pool.length) {\n result += pool[Math.floor(Math.random() * pool.length)];\n }\n\n const upperCaseResult = result.toUpperCase();\n return upperCaseResult.padEnd(length, upperCaseResult);\n }\n\n constructor({\n fileAuthStateDirectoryPath,\n mongoURL,\n mongoCollection = 'whatsapp-auth',\n logger,\n onOpen,\n onClose,\n onQR,\n onReceiveMessages,\n onConnectionStatusChange,\n debug,\n printQRInTerminal,\n pairingPhone,\n customPairingCode,\n allowUseLastVersion = true,\n }: WhatsappSocketBaseProps) {\n this.mongoURL = mongoURL;\n this.fileAuthStateDirectoryPath = fileAuthStateDirectoryPath;\n this.mongoCollection = mongoCollection;\n this.logger = logger;\n this.debug = debug;\n this.printQRInTerminal = printQRInTerminal;\n this.pairingPhone = pairingPhone;\n this.customPairingCode = customPairingCode;\n this.allowUseLastVersion = allowUseLastVersion;\n this.onConnectionStatusChange = onConnectionStatusChange;\n this.socket = null;\n this.onReceiveMessages = onReceiveMessages;\n this.onOpen = onOpen;\n this.onClose = onClose;\n this.onQR = onQR;\n }\n\n private async getAuthCollection(): Promise<[] | [Collection<MongoDocument>, MongoClient]> {\n if (!this.mongoURL) return [];\n\n const mongoClient = new MongoClient(this.mongoURL);\n await mongoClient.connect();\n const collection = mongoClient.db().collection(this.mongoCollection);\n\n return [collection, mongoClient];\n }\n\n private async authenticate(): Promise<{ auth: AuthenticationState; saveCreds: any }> {\n if (!this.mongoURL && !this.fileAuthStateDirectoryPath) {\n throw new Error('fileAuthStateDirectoryPath/MongoURL is missing');\n }\n if (!this.mongoURL) {\n const { saveCreds, state } = await useMultiFileAuthState(this.fileAuthStateDirectoryPath as string);\n return { auth: state, saveCreds };\n }\n\n const [collection] = await this.getAuthCollection();\n\n const { state, saveCreds } = await useMongoDBAuthState(collection);\n const auth = {\n creds: state.creds,\n keys: makeCacheableSignalKeyStore(state.keys, pinoLogger as any),\n } as AuthenticationState;\n\n return { auth, saveCreds };\n }\n\n async startConnection({\n options,\n connectionAttempts = 3,\n onOpen = this.onOpen,\n onClose = this.onClose,\n onQR = this.onQR,\n onConnectionStatusChange = this.onConnectionStatusChange,\n pairingPhone: _pairingPhone,\n debug: _debug,\n }: {\n options?: UserFacingSocketConfig;\n debug?: boolean;\n pairingPhone?: string;\n connectionAttempts?: number;\n onOpen?: () => Promise<void> | void;\n onClose?: () => Promise<void> | void;\n onQR?: (qr: string, code?: string | null) => Promise<void> | void;\n onConnectionStatusChange?: (status: 'open' | 'close' | 'connecting') => Promise<void> | void;\n } = {}): Promise<WASocket | null> {\n const pairingPhone = _pairingPhone ?? this.pairingPhone;\n const { saveCreds, auth } = await this.authenticate();\n const debug = _debug === undefined ? this.debug : _debug;\n\n // Fetch latest Baileys version for better compatibility\n const { version, isLatest } = await fetchLatestBaileysVersion();\n if (this.allowUseLastVersion && !isLatest) {\n if (debug)\n this.logger?.warn('WHATSAPP', 'current baileys service is not the latest version!', {\n version,\n isLatest,\n });\n }\n\n const connect = async (): Promise<WASocket | null> => {\n return new Promise((resolve) => {\n const sock = makeWASocket({\n version: this.allowUseLastVersion ? version : [2, 3000, 1027934701],\n logger: pinoLogger,\n browser: ['Ubuntu', 'Chrome', '20.0.04'],\n syncFullHistory: false, // Don't sync full history on first connect\n shouldSyncHistoryMessage: () => false,\n shouldIgnoreJid: (jid) => jid.includes('@newsletter'), // Ignore newsletter\n ...options,\n printQRInTerminal: false,\n ...{ auth },\n });\n\n // CRITICAL: Handle connection updates properly\n sock.ev.on('connection.update', async (update) => {\n const { connection, lastDisconnect, qr } = update;\n\n if (qr) {\n if (debug) this.logger?.info('WHATSAPP', 'QR Code received', { qr });\n if (this.printQRInTerminal) {\n const qrcode = await WhatsappSocketBase.qrToTerminalString(qr, { small: true }).catch(\n () => null\n );\n console.log(qrcode);\n }\n\n // @ts-ignore\n const pair = this.customPairingCode\n ? WhatsappSocketBase.randomPairingCode(this.customPairingCode)\n : undefined;\n\n const pairing = pairingPhone ? WhatsappSocketBase.formatPhoneNumber(pairingPhone) : null;\n const code = pairing ? await sock.requestPairingCode(pairing) : null;\n\n if (debug && this.printQRInTerminal) {\n this.logger?.info('WHATSAPP', 'QR Pairing Code', { code, pairingPhone: pairing });\n }\n\n await onQR?.(qr, code);\n }\n\n switch (connection) {\n case 'connecting': {\n if (debug) this.logger?.debug('WHATSAPP', 'Connecting...');\n onConnectionStatusChange?.('connecting');\n break;\n }\n\n case 'open': {\n if (debug) this.logger?.info('WHATSAPP', 'Connection opened successfully!');\n this.socket = sock;\n await onOpen?.();\n onConnectionStatusChange?.('open');\n resolve(this.socket);\n break;\n }\n\n case 'close': {\n const shouldReconnect =\n connectionAttempts-- > 0 &&\n (lastDisconnect?.error as Boom)?.output?.statusCode !== DisconnectReason.loggedOut;\n\n const statusCode = (lastDisconnect?.error as Boom)?.output?.statusCode;\n const errorMessage = lastDisconnect?.error?.message;\n\n if (debug) {\n this.logger?.info('WHATSAPP', 'Connection closed', {\n statusCode,\n errorMessage,\n shouldReconnect,\n });\n }\n\n // IMPORTANT: Error code 515 (Stream Errored) after QR scan is NORMAL\n // The connection must restart after pairing - this is expected behavior\n if (shouldReconnect && connectionAttempts) {\n if (debug) this.logger?.info('WHATSAPP', 'Reconnecting...');\n await sleep(WhatsappSocketBase.CONNECTION_TIMEOUT);\n resolve(connect());\n } else {\n if (debug) this.logger?.warn('WHATSAPP', 'Logged out, clearing auth state');\n await onClose?.();\n this.socket = null;\n resolve(this.socket);\n }\n\n onConnectionStatusChange?.('close');\n break;\n }\n }\n });\n\n // Save credentials when they update\n sock.ev.on('creds.update', saveCreds);\n\n // Handle messages\n if (this.onReceiveMessages && typeof this.onReceiveMessages === 'function') {\n sock.ev.on('messages.upsert', async ({ messages, type }) => {\n this.logger?.info('WHATSAPP', 'Received messages', { type, totalMessages: messages.length });\n this.onReceiveMessages?.(messages, type);\n\n // const msg = messages[0]\n // if (!msg.key.fromMe && msg.message?.conversation) {\n // const sender = msg.key.remoteJid\n // const text = msg.message.conversation.toLowerCase()\n //\n // console.log(`📩 Message from ${sender}: ${text}`)\n //\n // if (text === 'hi') {\n // await sock.sendMessage(sender, { text: 'Hello! How can I help you today?' })\n // }\n // }\n });\n }\n });\n };\n\n const socket = await connect();\n\n return socket;\n }\n\n async closeConnection() {\n if (this.socket) {\n if (this.debug) this.logger?.info('WHATSAPP', 'Closing connection');\n this.socket.end(undefined);\n this.socket = null;\n }\n }\n\n async clearAuthState() {\n if (this.mongoURL) {\n const [collection, mongoClient] = await this.getAuthCollection();\n\n if (this.debug) this.logger?.info('WHATSAPP', 'Deleting auth state, required to scanning QR again');\n await collection?.deleteMany({});\n await mongoClient?.close();\n } else if (this.fileAuthStateDirectoryPath) {\n fs.rmSync(this.fileAuthStateDirectoryPath, { recursive: true, force: true });\n }\n }\n\n async resetConnection({ pairingPhone }: { pairingPhone?: string } = {}) {\n await this.closeConnection();\n await this.clearAuthState();\n // Wait a bit before reconnecting\n await new Promise((resolve) => setTimeout(resolve, 2000));\n await this.startConnection({ pairingPhone });\n }\n\n isConnected() {\n return this.socket !== null && this.socket.user !== undefined;\n }\n}\n","import { type MiscMessageGenerationOptions, generateWAMessageFromContent } from '@fadzzzslebew/baileys';\nimport { WAProto as proto } from '@fadzzzslebew/baileys';\nimport { WhatsappSocketBase, type WhatsappSocketBaseProps } from './whatsappSocket.base.ts';\nexport type { WhatsappSocketBaseProps as WhatsappSocketMessagesProps } from './whatsappSocket.base.ts';\nimport { type StringValue } from 'ms';\nimport { getTotalSeconds } from './helpers.ts';\n\ntype ButtonURL = { label: string; url: string };\ntype ButtonCopy = { label: string; copy: string };\ntype ButtonPhone = { label: string; tel: string };\ntype ButtonEmail = { label: string; email: string };\ntype ButtonReminder = { label: string; reminderName: string } & (\n | { reminderOn?: StringValue; reminderDate: number }\n | { reminderOn: StringValue; reminderDate?: number | Date | string }\n);\n\ntype ButtonParamsJson = {\n display_text: string;\n url?: string;\n copy_code?: string;\n phone_number?: string;\n email?: string;\n reminder_name?: string;\n reminder_timestamp?: number;\n};\n\ntype CallToActionButtons = Array<\n ButtonURL | ButtonCopy | ButtonPhone\n // ButtonEmail | ButtonReminder // not supported\n>;\n\ntype CallToActionFullButtons = Array<ButtonURL | ButtonCopy | ButtonPhone | ButtonEmail | ButtonReminder>;\n\nexport class WhatsappSocketMessages extends WhatsappSocketBase {\n static DEFAULT_COUNTRY_CODE: string = '972';\n\n constructor(props: WhatsappSocketBaseProps) {\n super(props);\n }\n\n async sendTextMessage(to: string, text: string, replyToMessageId?: string): Promise<any> {\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketMessages.formatPhoneNumberToWhatsappPattern(to);\n const options: MiscMessageGenerationOptions = {\n ...(replyToMessageId && { quoted: { key: { id: replyToMessageId } } }),\n };\n\n return this.socket?.sendMessage(jid, { text }, options);\n }\n\n async sendButtonsMessage(\n to: string,\n { subtitle, title, buttons }: { title: string; subtitle?: string; buttons: CallToActionButtons }\n ): Promise<any> {\n if (!title || !buttons.length) {\n throw new Error('sendButtonsMessage: No title or buttons required field found.');\n }\n\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketMessages.formatPhoneNumberToWhatsappPattern(to);\n\n const buttonsValue = (buttons as CallToActionFullButtons)\n ?.map((btn) => {\n const buttonParamsJson: ButtonParamsJson = { display_text: btn.label };\n\n let name: string;\n switch (true) {\n case !!(btn as ButtonURL).url:\n name = 'cta_url';\n buttonParamsJson.url = (btn as ButtonURL).url;\n break;\n case !!(btn as ButtonCopy).copy:\n name = 'cta_copy';\n buttonParamsJson.copy_code = (btn as ButtonCopy).copy;\n break;\n case !!(btn as ButtonPhone).tel:\n name = 'cta_call';\n buttonParamsJson.phone_number = (btn as ButtonPhone).tel;\n break;\n case !!(btn as ButtonEmail).email:\n name = 'cta_email';\n buttonParamsJson.email = (btn as ButtonEmail).email;\n break;\n case !!((btn as ButtonReminder).reminderOn || (btn as ButtonReminder).reminderDate):\n name = 'cta_reminder';\n const { reminderOn, reminderDate } = btn as ButtonReminder;\n buttonParamsJson.reminder_name = (btn as ButtonReminder).reminderName;\n buttonParamsJson.reminder_timestamp = reminderDate\n ? Math.floor(+new Date(reminderDate) / 1000)\n : Math.floor(Date.now() / 1000) + getTotalSeconds(reminderOn ?? '0s');\n break;\n default:\n name = '';\n break;\n }\n\n return { name, buttonParamsJson: JSON.stringify(buttonParamsJson) };\n })\n .filter((v) => v.name);\n\n const msg = generateWAMessageFromContent(\n jid,\n {\n viewOnceMessage: {\n message: {\n interactiveMessage: proto.Message.InteractiveMessage.create({\n ...(title && {\n body: proto.Message.InteractiveMessage.Body.create({ text: title }),\n }),\n ...(subtitle && {\n footer: proto.Message.InteractiveMessage.Footer.create({ text: subtitle }),\n }),\n ...(!!buttonsValue?.length && {\n nativeFlowMessage: proto.Message.InteractiveMessage.NativeFlowMessage.create({\n buttons: buttonsValue,\n }),\n }),\n }),\n },\n },\n },\n { userJid: jid }\n );\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'send buttons message', {\n jid,\n footer: subtitle,\n body: title,\n buttons: buttonsValue,\n });\n }\n\n return this.socket?.relayMessage(jid, msg.message!, { messageId: msg.key.id! });\n }\n\n async sendReplyButtonsMessage(\n to: string,\n {\n title,\n subtitle,\n buttons,\n }: {\n title: string;\n subtitle?: string;\n buttons: string[];\n }\n ): Promise<any> {\n if (!title || !buttons.length) {\n throw new Error('sendReplyButtonsMessage: No title or buttons required field found.');\n }\n\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketMessages.formatPhoneNumberToWhatsappPattern(to);\n\n const buttonsValue = buttons\n .filter((v) => v)\n .map((displayText, index) => ({ buttonId: `id${index}`, buttonText: { displayText }, type: 1 }));\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'send reply buttons message', {\n jid,\n text: title,\n footer: subtitle,\n buttons: buttonsValue,\n });\n }\n\n return this.socket?.sendMessage(jid, {\n text: title,\n ...(subtitle && { footer: subtitle }),\n buttons: buttonsValue /* type: UNKNOWN = 0, RESPONSE = 1, NATIVE_FLOW = 2 */,\n });\n }\n}\n","import { type AnyMessageContent } from '@fadzzzslebew/baileys';\nimport { Readable } from 'stream';\nimport { WhatsappSocketMessages, type WhatsappSocketMessagesProps } from './whatsappSocket.messages.ts';\nexport { type WhatsappSocketMessagesProps as WhatsappSocketStreamProps } from './whatsappSocket.messages';\n\nexport class WhatsappSocketStream extends WhatsappSocketMessages {\n static DEFAULT_COUNTRY_CODE: string = '972';\n\n constructor(props: WhatsappSocketMessagesProps) {\n super(props);\n }\n\n protected async sendFileFromStream(\n to: string,\n stream: Readable | Buffer,\n options: {\n filename: string;\n mimetype?: string;\n caption?: string;\n replyToMessageId?: string;\n // File type specific options\n ptt?: boolean; // Push to talk (voice note)\n seconds?: number; // Duration for audio/video\n gifPlayback?: boolean; // For GIF videos\n // Additional options\n jpegThumbnail?: Buffer | string; // Thumbnail for videos/documents\n }\n ): Promise<any> {\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketStream.formatPhoneNumberToWhatsappPattern(to);\n\n // Convert stream to buffer if needed\n const buffer = stream instanceof Buffer ? stream : await this.streamToBuffer(stream as Readable);\n\n // Auto-detect mimetype if not provided\n const mimetype = options.mimetype || this.getMimetypeFromFilename(options.filename);\n\n // Determine message type based on mimetype\n const messageContent = await this.createFileMessage(buffer, mimetype, options);\n\n const messageOptions: any = {\n ...(options.replyToMessageId && {\n quoted: { key: { id: options.replyToMessageId } },\n }),\n };\n\n return this.socket?.sendMessage(jid, messageContent, messageOptions);\n }\n\n private async streamToBuffer(stream: Readable): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n stream.on('data', (chunk) => chunks.push(Buffer.from(chunk)));\n stream.on('error', (err) => reject(err));\n stream.on('end', () => resolve(Buffer.concat(chunks)));\n });\n }\n\n private getMimetypeFromFilename(filename: string): string {\n const ext = filename.split('.').pop()?.toLowerCase();\n\n const mimetypes: { [key: string]: string } = {\n // Images\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n png: 'image/png',\n gif: 'image/gif',\n webp: 'image/webp',\n bmp: 'image/bmp',\n svg: 'image/svg+xml',\n\n // Videos\n mp4: 'video/mp4',\n avi: 'video/x-msvideo',\n mov: 'video/quicktime',\n mkv: 'video/x-matroska',\n webm: 'video/webm',\n\n // Audio\n mp3: 'audio/mpeg',\n wav: 'audio/wav',\n ogg: 'audio/ogg',\n opus: 'audio/opus',\n aac: 'audio/aac',\n m4a: 'audio/mp4',\n\n // Documents\n pdf: 'application/pdf',\n doc: 'application/msword',\n docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n xls: 'application/vnd.ms-excel',\n xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n ppt: 'application/vnd.ms-powerpoint',\n pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n txt: 'text/plain',\n zip: 'application/zip',\n rar: 'application/x-rar-compressed',\n '7z': 'application/x-7z-compressed',\n };\n\n return mimetypes[ext || ''] || 'application/octet-stream';\n }\n\n private async createFileMessage(\n buffer: Buffer,\n mimetype: string,\n options: {\n filename: string;\n caption?: string;\n ptt?: boolean;\n seconds?: number;\n gifPlayback?: boolean;\n jpegThumbnail?: Buffer | string;\n }\n ): Promise<AnyMessageContent> {\n const [type] = mimetype.split('/');\n\n switch (type) {\n case 'image':\n return {\n image: buffer,\n caption: options.caption,\n mimetype,\n fileName: options.filename,\n };\n\n case 'video':\n return {\n video: buffer,\n caption: options.caption,\n mimetype,\n fileName: options.filename,\n gifPlayback: options.gifPlayback || false,\n jpegThumbnail: options.jpegThumbnail as string,\n ...(options.seconds && { seconds: options.seconds }),\n };\n\n case 'audio':\n if (options.ptt) {\n // Voice note\n return {\n audio: buffer,\n mimetype: 'audio/ogg; codecs=opus',\n ptt: true,\n ...(options.seconds && { seconds: options.seconds }),\n };\n }\n return {\n audio: buffer,\n mimetype,\n fileName: options.filename,\n ...(options.seconds && { seconds: options.seconds }),\n };\n\n default:\n // Document (PDF, DOC, etc.)\n return {\n document: buffer,\n mimetype,\n fileName: options.filename,\n caption: options.caption,\n jpegThumbnail: options.jpegThumbnail as string,\n };\n }\n }\n\n // Helper method to send specific file types\n protected async sendImage(\n to: string,\n imageBuffer: Buffer | Readable,\n options: {\n caption?: string;\n filename?: string;\n replyToMessageId?: string;\n } = {}\n ): Promise<any> {\n return this.sendFileFromStream(to, imageBuffer, {\n filename: options.filename || 'image.jpg',\n caption: options.caption,\n replyToMessageId: options.replyToMessageId,\n });\n }\n\n protected async sendVideo(\n to: string,\n videoBuffer: Buffer | Readable,\n options: {\n caption?: string;\n filename?: string;\n gifPlayback?: boolean;\n replyToMessageId?: string;\n jpegThumbnail?: Buffer;\n } = {}\n ): Promise<any> {\n return this.sendFileFromStream(to, videoBuffer, {\n filename: options.filename || 'video.mp4',\n caption: options.caption,\n gifPlayback: options.gifPlayback,\n replyToMessageId: options.replyToMessageId,\n jpegThumbnail: options.jpegThumbnail,\n });\n }\n\n protected async sendAudio(\n to: string,\n audioBuffer: Buffer | Readable,\n options: {\n filename?: string;\n ptt?: boolean; // Voice note\n seconds?: number;\n replyToMessageId?: string;\n } = {}\n ): Promise<any> {\n return this.sendFileFromStream(to, audioBuffer, {\n filename: options.filename || 'audio.mp3',\n mimetype: options.ptt ? 'audio/ogg; codecs=opus' : '',\n ptt: options.ptt,\n seconds: options.seconds,\n replyToMessageId: options.replyToMessageId,\n });\n }\n\n protected async sendDocument(\n to: string,\n documentBuffer: Buffer | Readable,\n options: {\n filename: string;\n caption?: string;\n mimetype?: string;\n replyToMessageId?: string;\n jpegThumbnail?: Buffer;\n }\n ): Promise<any> {\n return this.sendFileFromStream(to, documentBuffer, {\n filename: options.filename,\n mimetype: options.mimetype,\n caption: options.caption,\n replyToMessageId: options.replyToMessageId,\n jpegThumbnail: options.jpegThumbnail,\n });\n }\n\n protected async sendVoiceNote(\n to: string,\n audioBuffer: Buffer | Readable,\n options: {\n seconds?: number;\n replyToMessageId?: string;\n } = {}\n ): Promise<any> {\n return this.sendAudio(to, audioBuffer, {\n ptt: true,\n seconds: options.seconds,\n replyToMessageId: options.replyToMessageId,\n });\n }\n\n protected async sendSticker(\n to: string,\n stickerBuffer: Buffer | Readable,\n options: {\n replyToMessageId?: string;\n } = {}\n ): Promise<any> {\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketStream.formatPhoneNumberToWhatsappPattern(to);\n const buffer =\n stickerBuffer instanceof Buffer ? stickerBuffer : await this.streamToBuffer(stickerBuffer as Readable);\n\n const messageOptions: any = {\n ...(options.replyToMessageId && {\n quoted: { key: { id: options.replyToMessageId } },\n }),\n };\n\n return this.socket?.sendMessage(jid, { sticker: buffer }, messageOptions);\n }\n}\n","import { ReadStream } from 'node:fs';\n\nimport { WhatsappSocketStream, type WhatsappSocketStreamProps } from './whatsappSocket.stream';\nexport { type WhatsappSocketStreamProps as WhatsappSocketFilesProps } from './whatsappSocket.stream';\nimport { getAudioFileDuration, getFilenameFromStream, getUrlBuffer, streamToBuffer } from './helpers.ts';\nimport { basename } from 'node:path';\n\nexport class WhatsappSocketFiles extends WhatsappSocketStream {\n static DEFAULT_COUNTRY_CODE: string = '972';\n\n constructor(props: WhatsappSocketStreamProps) {\n super(props);\n }\n\n async sendImageMessage(\n to: string,\n imageSrc: string | Buffer<any> | ReadStream,\n { caption = '', filename }: { caption?: string; filename?: string } = {}\n ) {\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketFiles.formatPhoneNumberToWhatsappPattern(to);\n const imageData = typeof imageSrc === 'string' ? await getUrlBuffer(imageSrc) : imageSrc;\n\n if (this.debug) this.logger?.debug('WHATSAPP', 'send image message', { jid, caption, filename });\n return await super.sendImage(jid, imageData, { caption, ...(filename && { filename }) });\n }\n\n async sendVideoMessage(\n to: string,\n videoSrc: string | Buffer<any> | ReadStream,\n {\n caption = '',\n filename,\n sendAsGifPlayback: gifPlayback = false,\n }: { caption?: string; sendAsGifPlayback?: boolean; filename?: string } = {}\n ) {\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketFiles.formatPhoneNumberToWhatsappPattern(to);\n const videoBuffer = typeof videoSrc === 'string' ? await getUrlBuffer(videoSrc) : videoSrc;\n\n if (this.debug) this.logger?.debug('WHATSAPP', 'send video message', { jid, caption, filename, gifPlayback });\n return await super.sendVideo(jid, videoBuffer, { caption, gifPlayback, ...(filename && { filename }) });\n }\n\n async sendFileMessage(\n to: string,\n fileSrc: string | Buffer<any> | ReadStream,\n {\n caption = '',\n mimetype = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n replyToMessageId,\n jpegThumbnailSrc,\n filename: _filename,\n }: {\n caption?: string;\n mimetype?: string;\n filename?: string;\n replyToMessageId?: string;\n jpegThumbnailSrc?: string | Buffer<any> | ReadStream;\n } = {}\n ) {\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketFiles.formatPhoneNumberToWhatsappPattern(to);\n const fileBuffer = typeof fileSrc === 'string' ? await getUrlBuffer(fileSrc) : fileSrc;\n\n let jpegThumbnailBuffer: Buffer<any> | undefined;\n if (typeof jpegThumbnailSrc === 'string') {\n jpegThumbnailBuffer = await getUrlBuffer(jpegThumbnailSrc);\n } else if (jpegThumbnailSrc instanceof ReadStream) {\n jpegThumbnailBuffer = await streamToBuffer(jpegThumbnailSrc);\n } else {\n jpegThumbnailBuffer = jpegThumbnailSrc;\n }\n\n let filename = 'mu-document';\n if (fileSrc instanceof ReadStream) {\n const fname = getFilenameFromStream(fileSrc);\n if (fname) filename = fname;\n } else if (typeof fileSrc === 'string') {\n filename = basename(fileSrc);\n }\n\n if (this.debug)\n this.logger?.debug('WHATSAPP', 'send file message', {\n jid,\n caption,\n mimetype,\n filename,\n replyToMessageId,\n includeJpegThumbnail: !!jpegThumbnailBuffer,\n });\n return await super.sendDocument(jid, fileBuffer, {\n caption,\n mimetype,\n filename,\n replyToMessageId,\n jpegThumbnail: jpegThumbnailBuffer,\n });\n }\n\n async sendAudioMessage(\n to: string,\n audioSrc: string | Buffer<any> | ReadStream,\n {\n filename,\n replyToMessageId,\n mimetype,\n seconds,\n }: { filename?: string; replyToMessageId?: string; mimetype?: string; seconds?: number } = {}\n ) {\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketFiles.formatPhoneNumberToWhatsappPattern(to);\n const audioBuffer = typeof audioSrc === 'string' ? await getUrlBuffer(audioSrc) : audioSrc;\n let durationInSeconds = seconds || (await getAudioFileDuration(audioBuffer, mimetype).catch(() => 0));\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'send audio message', {\n jid,\n mimetype,\n filename,\n seconds: durationInSeconds,\n replyToMessageId,\n });\n }\n\n return await super.sendAudio(jid, audioBuffer, {\n ...(filename && { filename }),\n ...(mimetype && { mimetype: mimetype }),\n ...(durationInSeconds && { seconds: durationInSeconds }),\n ...(replyToMessageId && { replyToMessageId: replyToMessageId }),\n });\n }\n\n /**\n * requirements:\n * * format .webp\n * * imageSize 512pxx512px\n * * maxSize: 100kb\n * * transparent background\n * @param to\n * @param imageSrc\n * @param replyToMessageId\n */\n async sendStickerMessage(\n to: string,\n imageSrc: string | Buffer<any> | ReadStream,\n { replyToMessageId }: { replyToMessageId?: string } = {}\n ) {\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketFiles.formatPhoneNumberToWhatsappPattern(to);\n const stickerBuffer = typeof imageSrc === 'string' ? await getUrlBuffer(imageSrc) : imageSrc;\n\n if (this.debug) this.logger?.debug('WHATSAPP', 'send sticker message', { jid, replyToMessageId });\n await super.sendSticker(jid, stickerBuffer, { replyToMessageId });\n }\n}\n","import { WhatsappSocketFiles, type WhatsappSocketFilesProps } from './whatsappSocket.files';\n\nexport class WhatsappSocket extends WhatsappSocketFiles {\n constructor(props: WhatsappSocketFilesProps) {\n super(props);\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/mongoAuthState.ts","../src/helpers.ts","../src/whatsappSocket.base.ts","../src/whatsappSocket.messages.ts","../src/whatsappSocket.stream.ts","../src/whatsappSocket.files.ts","../src/whatsappSocket.client.ts"],"names":["BufferJSON","_k","value","_","val","useMongoDBAuthState","collection","writeData","data","id","update","readData","removeData","creds","initAuthCreds","type","ids","proto","tasks","category","key","mongoAuthState_default","getTotalSeconds","msValue","ms","getUrlBuffer","url","arrayBuffer","getDurationFromStream","stream","mimeType","metadata","parseStream","error","getDurationFromBuffer","buffer","parseBuffer","getAudioFileDuration","audioFile","ReadStream","streamToBuffer","chunks","chunk","getFilenameFromStream","pathStr","basename","sleep","timeout","resolve","MIME_TYPES","pinoLogger","P","WhatsappSocketBase","_WhatsappSocketBase","phone","countryCode","strNumber","message","formattedPhone","query","qr","options","QRCode","pattern","length","result","pool","buildPool","block","chars","i","start","end","c","char","upperCaseResult","fileAuthStateDirectoryPath","mongoURL","mongoCollection","logger","onOpen","onClose","onQR","onReceiveMessages","onConnectionStatusChange","debug","printQRInTerminal","pairingPhone","customPairingCode","onPreConnectionSendMessageFailed","appName","sources","response","mongoClient","MongoClient","saveCreds","state","useMultiFileAuthState","makeCacheableSignalKeyStore","connectionAttempts","_pairingPhone","_debug","auth","version","connect","sock","makeWASocket","jid","connection","lastDisconnect","qrcode","pairing","code","shouldReconnect","DisconnectReason","statusCode","errorMessage","messages","socket","fs","autoConnect","WhatsappSocketMessages","_WhatsappSocketMessages","props","to","text","replyToMessageId","subtitle","title","buttons","buttonsValue","btn","buttonParamsJson","name","reminderOn","reminderDate","v","msg","generateWAMessageFromContent","index","WhatsappSocketStream","_WhatsappSocketStream","mimetype","messageContent","messageOptions","reject","err","filename","ext","imageBuffer","videoBuffer","audioBuffer","documentBuffer","stickerBuffer","WhatsappSocketFiles","_WhatsappSocketFiles","imageSrc","caption","imageData","videoSrc","gifPlayback","fileSrc","jpegThumbnailSrc","_filename","fileBuffer","jpegThumbnailBuffer","fname","audioSrc","seconds","durationInSeconds","WhatsappSocket"],"mappings":"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","file":"index.cjs","sourcesContent":["import {\n type AuthenticationCreds,\n type SignalDataTypeMap,\n initAuthCreds,\n WAProto as proto,\n} from '@fadzzzslebew/baileys';\n\nconst BufferJSON = {\n replacer: (_k: string, value: any) => {\n if (Buffer.isBuffer(value) || value instanceof Uint8Array || value?.type === 'Buffer') {\n return {\n type: 'Buffer',\n data: Buffer.from(value?.data || value).toString('base64'),\n };\n }\n return value;\n },\n\n reviver: (_: string, value: any) => {\n if (typeof value === 'object' && !!value && (value.buffer === true || value.type === 'Buffer')) {\n const val = value.data || value.value;\n return typeof val === 'string' ? Buffer.from(val, 'base64') : Buffer.from(val || []);\n }\n return value;\n },\n};\n\nconst useMongoDBAuthState = async (collection: any) => {\n const writeData = (data: any, id: string) => {\n const informationToStore = JSON.parse(JSON.stringify(data, BufferJSON.replacer));\n const update = { $set: { ...informationToStore } };\n return collection.updateOne({ _id: id }, update, { upsert: true });\n };\n\n const readData = async (id: string) => {\n try {\n const data = JSON.stringify(await collection.findOne({ _id: id }));\n return JSON.parse(data, BufferJSON.reviver);\n } catch (error) {\n return null;\n }\n };\n\n const removeData = async (id: string) => {\n try {\n await collection.deleteOne({ _id: id });\n } catch (_a) {}\n };\n\n const creds: AuthenticationCreds = (await readData('creds')) || initAuthCreds();\n\n return {\n state: {\n creds,\n keys: {\n get: async (type: keyof SignalDataTypeMap, ids: string[]) => {\n const data: { [id: string]: any } = {};\n await Promise.all(\n ids.map(async (id) => {\n let value = await readData(`${type}-${id}`);\n if (type === 'app-state-sync-key' && value) {\n value = proto.Message.AppStateSyncKeyData.fromObject(value);\n }\n data[id] = value;\n })\n );\n return data;\n },\n set: async (data: any) => {\n const tasks: Promise<any>[] = [];\n for (const category of Object.keys(data)) {\n for (const id of Object.keys(data[category])) {\n const value = data[category][id];\n const key = `${category}-${id}`;\n tasks.push(value ? writeData(value, key) : removeData(key));\n }\n }\n await Promise.all(tasks);\n },\n },\n },\n saveCreds: () => {\n return writeData(creds, 'creds');\n },\n };\n};\n\nexport default useMongoDBAuthState;\n","import ms, { type StringValue } from 'ms';\nimport { parseBuffer, parseStream } from 'music-metadata';\nimport { ReadStream } from 'node:fs';\nimport { basename } from 'node:path';\n\nexport const getTotalSeconds = (msValue: StringValue) => {\n const value = ms(msValue);\n return value / 1000;\n};\n\nexport async function getUrlBuffer(url: string) {\n const response = await fetch(url);\n const arrayBuffer = await response.arrayBuffer();\n const buffer = Buffer.from(arrayBuffer);\n return buffer;\n}\n\nasync function getDurationFromStream(stream: ReadStream, mimeType?: string): Promise<number> {\n try {\n const metadata = await parseStream(stream, { mimeType: mimeType || 'audio/mpeg' });\n return Math.floor(metadata.format.duration || 0);\n } catch (error) {\n console.error('Error parsing stream:', error);\n throw error;\n } finally {\n if (!stream.destroyed) {\n stream.destroy();\n }\n }\n}\nasync function getDurationFromBuffer(buffer: Buffer, mimeType?: string): Promise<number> {\n try {\n const metadata = await parseBuffer(buffer, mimeType || 'audio/mpeg').catch(() => null);\n return metadata ? Math.floor(metadata.format.duration || 0) : 0;\n } catch (error) {\n console.error('Error parsing buffer:', error);\n throw error;\n }\n}\n\nexport async function getAudioFileDuration(audioFile: ReadStream | Buffer, mimeType?: string): Promise<number> {\n if (audioFile instanceof ReadStream) {\n return getDurationFromStream(audioFile, mimeType);\n } else {\n return getDurationFromBuffer(audioFile, mimeType);\n }\n}\n\nexport async function streamToBuffer(stream: ReadStream): Promise<Buffer> {\n const chunks: Buffer[] = [];\n\n for await (const chunk of stream) {\n chunks.push(chunk);\n }\n\n return Buffer.concat(chunks);\n}\n\nexport function getFilenameFromStream(stream: ReadStream): string | undefined {\n if (stream.path) {\n const pathStr = stream.path.toString();\n return basename(pathStr);\n }\n return undefined;\n}\n\nexport const sleep = (timeout: StringValue | number) => {\n return new Promise((resolve) => setTimeout(resolve, typeof timeout === 'number' ? timeout : ms(timeout)));\n};\n\nexport const MIME_TYPES: { [key: string]: string } = {\n // Images\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n png: 'image/png',\n gif: 'image/gif',\n webp: 'image/webp',\n bmp: 'image/bmp',\n svg: 'image/svg+xml',\n\n // Videos\n mp4: 'video/mp4',\n avi: 'video/x-msvideo',\n mov: 'video/quicktime',\n mkv: 'video/x-matroska',\n webm: 'video/webm',\n\n // Audio\n mp3: 'audio/mpeg',\n wav: 'audio/wav',\n ogg: 'audio/ogg',\n opus: 'audio/opus',\n aac: 'audio/aac',\n m4a: 'audio/mp4',\n\n // Documents\n pdf: 'application/pdf',\n doc: 'application/msword',\n docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n xls: 'application/vnd.ms-excel',\n xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n ppt: 'application/vnd.ms-powerpoint',\n pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n txt: 'text/plain',\n zip: 'application/zip',\n rar: 'application/x-rar-compressed',\n '7z': 'application/x-7z-compressed',\n};\n","// Baileys links\n// https://whiskeysockets.github.io/docs/tutorial-basics/sending-messages\n// https://github.com/WhiskeySockets/Baileys\n// https://github.com/ndalu-id/baileys-api\n// https://whiskeysockets.github.io/Baileys/\n// alternatives:\n// https://www.npmjs.com/package/mudslide\n// https://www.npmjs.com/package/whatsapp-web.js\n// https://www.npmjs.com/package/wbm\nimport {\n default as makeWASocket,\n DisconnectReason,\n makeCacheableSignalKeyStore,\n type MessageUpsertType,\n type UserFacingSocketConfig,\n type WAMessage,\n type WASocket,\n useMultiFileAuthState,\n type AuthenticationState,\n} from '@fadzzzslebew/baileys';\nimport { type StringValue } from 'ms';\nimport type { Logger as MyLogger } from 'stack-trace-logger';\nimport fs from 'node:fs';\nimport QRCode from 'qrcode';\nimport { type Collection, type Document as MongoDocument, MongoClient } from 'mongodb';\nimport P from 'pino';\nimport type { Boom } from '@hapi/boom';\nimport useMongoDBAuthState from './mongoAuthState.ts';\nimport { sleep } from './helpers.ts';\n\nconst pinoLogger: any = P({ level: 'silent' });\n\nexport type WhatsappSocketBaseProps = (\n | { mongoURL: string; fileAuthStateDirectoryPath?: string }\n | { mongoURL?: string; fileAuthStateDirectoryPath: string }\n) & {\n appName?: string;\n logger?: MyLogger;\n mongoCollection?: string;\n onOpen?: () => Promise<void> | void;\n onClose?: () => Promise<void> | void;\n onConnectionStatusChange?: (connectionStatus: 'connecting' | 'close' | 'open') => Promise<void> | void;\n onReceiveMessages?: (messages: WAMessage[], type: MessageUpsertType) => Promise<void> | void;\n onPreConnectionSendMessageFailed?: (error: Error | string) => Promise<void> | void;\n onQR?: (qr: string, code?: string | null) => Promise<void> | void;\n debug?: boolean;\n printQRInTerminal?: boolean;\n pairingPhone?: string;\n customPairingCode?: string;\n};\n\nexport class WhatsappSocketBase {\n protected socket: null | WASocket;\n protected readonly fileAuthStateDirectoryPath?: string;\n protected readonly mongoURL?: string;\n protected readonly mongoCollection: string = 'whatsapp-auth';\n protected readonly logger?: MyLogger;\n protected readonly debug?: boolean;\n protected readonly printQRInTerminal?: boolean;\n protected readonly pairingPhone?: string;\n protected readonly customPairingCode?: string;\n protected readonly appName?: string;\n private onPreConnectionSendMessageFailed?: (error: Error | string) => Promise<void> | void;\n private onOpen?: () => Promise<void> | void;\n private onClose?: () => Promise<void> | void;\n private onQR?: (qr: string, code?: string | null) => Promise<void> | void;\n private onConnectionStatusChange?: (connectionStatus: 'open' | 'close' | 'connecting') => Promise<void> | void;\n private readonly onReceiveMessages?: (messages: WAMessage[], type: MessageUpsertType) => Promise<void> | void;\n static DEFAULT_COUNTRY_CODE: string = '972';\n static CONNECTION_TIMEOUT: StringValue = '2s';\n\n static formatPhoneNumber(phone: string, countryCode: string = WhatsappSocketBase.DEFAULT_COUNTRY_CODE): string {\n if (phone.endsWith('@s.whatsapp.net')) return phone;\n\n let strNumber = phone.replace(/[^0-9]/g, '');\n if (strNumber.startsWith('05')) strNumber = strNumber.substring(1);\n if (!strNumber.startsWith(countryCode)) strNumber = countryCode + strNumber;\n\n return strNumber; // formatted Number should look like: '+972 051-333-4444' to: '972513334444'\n }\n\n static formatPhoneNumberToWhatsappPattern(\n phone: string,\n countryCode: string = WhatsappSocketBase.DEFAULT_COUNTRY_CODE\n ): string {\n if (phone.endsWith('@s.whatsapp.net')) return phone;\n\n let strNumber = WhatsappSocketBase.formatPhoneNumber(phone, countryCode);\n strNumber = `${strNumber}@s.whatsapp.net`; // formatted Number should look like: '972513334444@s.whatsapp.net'\n return strNumber;\n }\n\n static getWhatsappPhoneLink({\n phone,\n message,\n countryCode = this.DEFAULT_COUNTRY_CODE,\n }: {\n phone: string;\n countryCode?: string;\n message?: string;\n }) {\n const formattedPhone = this.formatPhoneNumber(phone, countryCode);\n const query = { ...(message && { text: encodeURI(message) }) };\n return `https://wa.me/${formattedPhone}?${query}`;\n }\n\n static async qrToImage(\n qr: string,\n options: {\n errorCorrectionLevel?: 'H' | 'L' | 'M';\n width?: number;\n margin?: number;\n [key: string]: any;\n } = {}\n ) {\n return QRCode.toDataURL(qr, {\n errorCorrectionLevel: 'H', // Changed to 'H' (High) for better reliability\n width: 400, // Increased size for better scanning\n margin: 2, // Ensure adequate margin\n ...options,\n });\n }\n\n static async qrToTerminalString(qr: string, options: { small?: boolean; [key: string]: any } = {}) {\n return QRCode.toString(qr, { type: 'terminal', small: true, ...options });\n }\n\n // only 8 alphanumeric (no more or less), patterns [a-z0-8] | aaaa[0-8] xxzzvvcc [zaq0-8]\n static randomPairingCode(pattern: string, length = 8) {\n // no randomness needed\n if (!pattern.includes('[') && pattern.length === length) {\n return pattern;\n }\n\n let result = '';\n let pool: string[] = [];\n\n const buildPool = (block: string) => {\n const chars: string[] = [];\n\n for (let i = 0; i < block.length; i++) {\n if (block[i + 1] === '-' && block[i + 2]) {\n const start = block.charCodeAt(i);\n const end = block.charCodeAt(i + 2);\n\n for (let c = start; c <= end; c++) {\n chars.push(String.fromCharCode(c));\n }\n\n i += 2;\n } else {\n chars.push(block[i]);\n }\n }\n\n return chars;\n };\n\n for (let i = 0; i < pattern.length && result.length < length; i++) {\n const char = pattern[i];\n\n if (char === '[') {\n const end = pattern.indexOf(']', i);\n const block = pattern.slice(i + 1, end);\n\n pool = buildPool(block);\n i = end;\n } else {\n result += char;\n }\n }\n\n // fill remaining from pool\n while (result.length < length && pool.length) {\n result += pool[Math.floor(Math.random() * pool.length)];\n }\n\n const upperCaseResult = result.toUpperCase();\n return upperCaseResult.padEnd(length, upperCaseResult);\n }\n\n constructor({\n fileAuthStateDirectoryPath,\n mongoURL,\n mongoCollection = 'whatsapp-auth',\n logger,\n onOpen,\n onClose,\n onQR,\n onReceiveMessages,\n onConnectionStatusChange,\n debug,\n printQRInTerminal,\n pairingPhone,\n customPairingCode,\n onPreConnectionSendMessageFailed,\n appName,\n }: WhatsappSocketBaseProps) {\n this.appName = appName;\n this.mongoURL = mongoURL;\n this.fileAuthStateDirectoryPath = fileAuthStateDirectoryPath;\n this.mongoCollection = mongoCollection;\n this.logger = logger;\n this.debug = debug;\n this.printQRInTerminal = printQRInTerminal;\n this.pairingPhone = pairingPhone;\n this.customPairingCode = customPairingCode;\n this.socket = null;\n this.onPreConnectionSendMessageFailed = onPreConnectionSendMessageFailed;\n this.onConnectionStatusChange = onConnectionStatusChange;\n this.onReceiveMessages = onReceiveMessages;\n this.onOpen = onOpen;\n this.onClose = onClose;\n this.onQR = onQR;\n }\n\n private async getLatestWhatsAppVersion(): Promise<[number, number, number]> {\n try {\n // Try multiple sources\n const sources = [\n 'https://raw.githubusercontent.com/WhiskeySockets/Baileys/master/src/Defaults/baileys-version.json',\n 'https://raw.githubusercontent.com/whiskeysockets/baileys/master/src/Defaults/baileys-version.json',\n ];\n\n for (const url of sources) {\n try {\n const response = await fetch(url);\n if (response.ok) {\n const data = await response.json();\n return data.version as [number, number, number];\n }\n } catch (err) {\n continue;\n }\n }\n\n // Fallback to a known working version\n console.log('Could not fetch version, using fallback');\n return [2, 3000, 1015901307]; // Recent version as of late 2024\n } catch (error) {\n console.error('Error fetching version:', error);\n return [2, 3000, 1015901307]; // Fallback\n }\n }\n\n private async getAuthCollection(): Promise<[] | [Collection<MongoDocument>, MongoClient]> {\n if (!this.mongoURL) return [];\n\n const mongoClient = new MongoClient(this.mongoURL);\n await mongoClient.connect();\n const collection = mongoClient.db().collection(this.mongoCollection);\n\n return [collection, mongoClient];\n }\n\n private async authenticate(): Promise<{ auth: AuthenticationState; saveCreds: any }> {\n if (!this.mongoURL && !this.fileAuthStateDirectoryPath) {\n throw new Error('fileAuthStateDirectoryPath/MongoURL is missing');\n }\n if (!this.mongoURL) {\n const { saveCreds, state } = await useMultiFileAuthState(this.fileAuthStateDirectoryPath as string);\n return { auth: state, saveCreds };\n }\n\n const [collection] = await this.getAuthCollection();\n\n const { state, saveCreds } = await useMongoDBAuthState(collection);\n const auth = {\n creds: state.creds,\n keys: makeCacheableSignalKeyStore(state.keys, pinoLogger as any),\n } as AuthenticationState;\n\n return { auth, saveCreds };\n }\n\n async startConnection({\n options,\n connectionAttempts = 3,\n onOpen = this.onOpen,\n onClose = this.onClose,\n onQR = this.onQR,\n onConnectionStatusChange = this.onConnectionStatusChange,\n pairingPhone: _pairingPhone,\n debug: _debug,\n }: {\n options?: UserFacingSocketConfig;\n debug?: boolean;\n pairingPhone?: string;\n connectionAttempts?: number;\n onOpen?: () => Promise<void> | void;\n onClose?: () => Promise<void> | void;\n onQR?: (qr: string, code?: string | null) => Promise<void> | void;\n onConnectionStatusChange?: (status: 'open' | 'close' | 'connecting') => Promise<void> | void;\n } = {}): Promise<WASocket | null> {\n const pairingPhone = _pairingPhone ?? this.pairingPhone;\n const { saveCreds, auth } = await this.authenticate();\n const debug = _debug === undefined ? this.debug : _debug;\n\n // Fetch latest Baileys version for better compatibility\n const version = await this.getLatestWhatsAppVersion();\n\n const connect = async (): Promise<WASocket | null> => {\n return new Promise((resolve) => {\n const sock = makeWASocket({\n version: version,\n logger: pinoLogger,\n browser: [this.appName || 'baileys', '1.0.0', ''], // ['Ubuntu', 'Chrome', '20.0.04'],\n syncFullHistory: false, // Don't sync full history on first connect\n shouldSyncHistoryMessage: () => false,\n shouldIgnoreJid: (jid) => jid.includes('@newsletter'), // Ignore newsletter\n ...options,\n printQRInTerminal: false,\n ...{ auth },\n });\n\n // CRITICAL: Handle connection updates properly\n sock.ev.on('connection.update', async (update) => {\n const { connection, lastDisconnect, qr } = update;\n\n if (qr) {\n if (debug) this.logger?.info('WHATSAPP', 'QR Code received', { qr });\n if (this.printQRInTerminal) {\n const qrcode = await WhatsappSocketBase.qrToTerminalString(qr, { small: true }).catch(\n () => null\n );\n console.log(qrcode);\n }\n\n // @ts-ignore\n const pair = this.customPairingCode\n ? WhatsappSocketBase.randomPairingCode(this.customPairingCode)\n : undefined;\n\n const pairing = pairingPhone ? WhatsappSocketBase.formatPhoneNumber(pairingPhone) : null;\n const code = pairing ? await sock.requestPairingCode(pairing) : null;\n\n if (debug && this.printQRInTerminal) {\n this.logger?.info('WHATSAPP', 'QR Pairing Code', { code, pairingPhone: pairing });\n }\n await onQR?.(qr, code);\n }\n\n switch (connection) {\n case 'connecting': {\n if (debug) this.logger?.debug('WHATSAPP', 'Connecting...');\n onConnectionStatusChange?.('connecting');\n break;\n }\n\n case 'open': {\n if (debug) this.logger?.info('WHATSAPP', 'Connection opened successfully!');\n this.socket = sock;\n await onOpen?.();\n onConnectionStatusChange?.('open');\n resolve(this.socket);\n break;\n }\n\n case 'close': {\n const shouldReconnect =\n connectionAttempts-- > 0 &&\n (lastDisconnect?.error as Boom)?.output?.statusCode !== DisconnectReason.loggedOut;\n\n const statusCode = (lastDisconnect?.error as Boom)?.output?.statusCode;\n const errorMessage = lastDisconnect?.error?.message;\n\n if (debug) {\n this.logger?.info('WHATSAPP', 'Connection closed', {\n statusCode,\n errorMessage,\n shouldReconnect,\n });\n }\n\n // IMPORTANT: Error code 515 (Stream Errored) after QR scan is NORMAL\n // The connection must restart after pairing - this is expected behavior\n if (shouldReconnect && connectionAttempts) {\n if (debug) this.logger?.info('WHATSAPP', 'Reconnecting...');\n await sleep(WhatsappSocketBase.CONNECTION_TIMEOUT);\n resolve(connect());\n } else {\n if (debug) this.logger?.warn('WHATSAPP', 'Logged out, clearing auth state');\n await onClose?.();\n this.socket = null;\n resolve(this.socket);\n }\n\n onConnectionStatusChange?.('close');\n break;\n }\n }\n });\n\n // Save credentials when they update\n sock.ev.on('creds.update', saveCreds);\n\n // Handle messages\n if (this.onReceiveMessages && typeof this.onReceiveMessages === 'function') {\n sock.ev.on('messages.upsert', async ({ messages, type }) => {\n this.logger?.info('WHATSAPP', 'Received messages', { type, totalMessages: messages.length });\n this.onReceiveMessages?.(messages, type);\n\n // const msg = messages[0]\n // if (!msg.key.fromMe && msg.message?.conversation) {\n // const sender = msg.key.remoteJid\n // const text = msg.message.conversation.toLowerCase()\n //\n // console.log(`📩 Message from ${sender}: ${text}`)\n //\n // if (text === 'hi') {\n // await sock.sendMessage(sender, { text: 'Hello! How can I help you today?' })\n // }\n // }\n });\n }\n });\n };\n\n const socket = await connect();\n await sleep(WhatsappSocketBase.CONNECTION_TIMEOUT);\n\n return socket;\n }\n\n async ensureSocketConnected(): Promise<WASocket | null> {\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection().catch((error: Error) => {\n this.onPreConnectionSendMessageFailed?.(error);\n return null;\n });\n }\n\n return this.socket;\n }\n\n async closeConnection() {\n if (this.socket) {\n if (this.debug) this.logger?.info('WHATSAPP', 'Closing connection');\n this.socket.end(undefined);\n this.socket = null;\n }\n }\n\n async clearAuthState() {\n await this.closeConnection();\n\n if (this.mongoURL) {\n const [collection, mongoClient] = await this.getAuthCollection();\n\n if (this.debug) this.logger?.info('WHATSAPP', 'Deleting auth state, required to scanning QR again');\n await collection?.deleteMany({});\n await mongoClient?.close();\n } else if (this.fileAuthStateDirectoryPath) {\n fs.rmSync(this.fileAuthStateDirectoryPath, { recursive: true, force: true });\n }\n }\n\n async resetConnection({ pairingPhone, autoConnect = true }: { pairingPhone?: string; autoConnect?: boolean } = {}) {\n await this.clearAuthState();\n if (!autoConnect) return;\n\n await sleep(WhatsappSocketBase.CONNECTION_TIMEOUT); // Wait a bit before reconnecting\n await this.startConnection({ pairingPhone });\n }\n\n isConnected() {\n return this.socket !== null && this.socket.user !== undefined;\n }\n}\n","import { type MiscMessageGenerationOptions, generateWAMessageFromContent } from '@fadzzzslebew/baileys';\nimport { WAProto as proto } from '@fadzzzslebew/baileys';\nimport { WhatsappSocketBase, type WhatsappSocketBaseProps } from './whatsappSocket.base.ts';\nexport type { WhatsappSocketBaseProps as WhatsappSocketMessagesProps } from './whatsappSocket.base.ts';\nimport { type StringValue } from 'ms';\nimport { getTotalSeconds } from './helpers.ts';\n\ntype ButtonURL = { label: string; url: string };\ntype ButtonCopy = { label: string; copy: string };\ntype ButtonPhone = { label: string; tel: string };\ntype ButtonEmail = { label: string; email: string };\ntype ButtonReminder = { label: string; reminderName: string } & (\n | { reminderOn?: StringValue; reminderDate: number }\n | { reminderOn: StringValue; reminderDate?: number | Date | string }\n);\n\ntype ButtonParamsJson = {\n display_text: string;\n url?: string;\n copy_code?: string;\n phone_number?: string;\n email?: string;\n reminder_name?: string;\n reminder_timestamp?: number;\n};\n\ntype CallToActionButtons = Array<\n ButtonURL | ButtonCopy | ButtonPhone\n // ButtonEmail | ButtonReminder // not supported\n>;\n\ntype CallToActionFullButtons = Array<ButtonURL | ButtonCopy | ButtonPhone | ButtonEmail | ButtonReminder>;\n\nexport class WhatsappSocketMessages extends WhatsappSocketBase {\n static DEFAULT_COUNTRY_CODE: string = '972';\n\n constructor(props: WhatsappSocketBaseProps) {\n super(props);\n }\n\n async sendTextMessage(to: string, text: string, replyToMessageId?: string): Promise<any> {\n await this.ensureSocketConnected();\n\n const jid = WhatsappSocketMessages.formatPhoneNumberToWhatsappPattern(to);\n const options: MiscMessageGenerationOptions = {\n ...(replyToMessageId && { quoted: { key: { id: replyToMessageId } } }),\n };\n\n return this.socket?.sendMessage(jid, { text }, options);\n }\n\n async sendButtonsMessage(\n to: string,\n { subtitle, title, buttons }: { title: string; subtitle?: string; buttons: CallToActionButtons }\n ): Promise<any> {\n if (!title || !buttons.length) {\n throw new Error('sendButtonsMessage: No title or buttons required field found.');\n }\n\n await this.ensureSocketConnected();\n\n const jid = WhatsappSocketMessages.formatPhoneNumberToWhatsappPattern(to);\n\n const buttonsValue = (buttons as CallToActionFullButtons)\n ?.map((btn) => {\n const buttonParamsJson: ButtonParamsJson = { display_text: btn.label };\n\n let name: string;\n switch (true) {\n case !!(btn as ButtonURL).url:\n name = 'cta_url';\n buttonParamsJson.url = (btn as ButtonURL).url;\n break;\n case !!(btn as ButtonCopy).copy:\n name = 'cta_copy';\n buttonParamsJson.copy_code = (btn as ButtonCopy).copy;\n break;\n case !!(btn as ButtonPhone).tel:\n name = 'cta_call';\n buttonParamsJson.phone_number = (btn as ButtonPhone).tel;\n break;\n case !!(btn as ButtonEmail).email:\n name = 'cta_email';\n buttonParamsJson.email = (btn as ButtonEmail).email;\n break;\n case !!((btn as ButtonReminder).reminderOn || (btn as ButtonReminder).reminderDate):\n name = 'cta_reminder';\n const { reminderOn, reminderDate } = btn as ButtonReminder;\n buttonParamsJson.reminder_name = (btn as ButtonReminder).reminderName;\n buttonParamsJson.reminder_timestamp = reminderDate\n ? Math.floor(+new Date(reminderDate) / 1000)\n : Math.floor(Date.now() / 1000) + getTotalSeconds(reminderOn ?? '0s');\n break;\n default:\n name = '';\n break;\n }\n\n return { name, buttonParamsJson: JSON.stringify(buttonParamsJson) };\n })\n .filter((v) => v.name);\n\n const msg = generateWAMessageFromContent(\n jid,\n {\n viewOnceMessage: {\n message: {\n interactiveMessage: proto.Message.InteractiveMessage.create({\n ...(title && {\n body: proto.Message.InteractiveMessage.Body.create({ text: title }),\n }),\n ...(subtitle && {\n footer: proto.Message.InteractiveMessage.Footer.create({ text: subtitle }),\n }),\n ...(!!buttonsValue?.length && {\n nativeFlowMessage: proto.Message.InteractiveMessage.NativeFlowMessage.create({\n buttons: buttonsValue,\n }),\n }),\n }),\n },\n },\n },\n { userJid: jid }\n );\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'send buttons message', {\n jid,\n footer: subtitle,\n body: title,\n buttons: buttonsValue,\n });\n }\n\n return this.socket?.relayMessage(jid, msg.message!, { messageId: msg.key.id! });\n }\n\n async sendReplyButtonsMessage(\n to: string,\n {\n title,\n subtitle,\n buttons,\n }: {\n title: string;\n subtitle?: string;\n buttons: Array<string | { id: number | string; label: string }>;\n }\n ): Promise<any> {\n if (!title || !buttons.length) {\n throw new Error('sendReplyButtonsMessage: No title or buttons required field found.');\n }\n await this.ensureSocketConnected();\n\n const jid = WhatsappSocketMessages.formatPhoneNumberToWhatsappPattern(to);\n\n const buttonsValue = buttons\n .filter((v) => v)\n .map((btn, index) =>\n typeof btn === 'string'\n ? { buttonId: `id-${index}`, buttonText: { displayText: btn }, type: 1 }\n : { buttonId: `${btn.id}`, buttonText: { displayText: btn.label }, type: 1 }\n );\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'send reply buttons message', {\n jid,\n text: title,\n footer: subtitle,\n buttons: buttonsValue,\n });\n }\n\n return this.socket?.sendMessage(jid, {\n text: title,\n ...(subtitle && { footer: subtitle }),\n buttons: buttonsValue /* type: UNKNOWN = 0, RESPONSE = 1, NATIVE_FLOW = 2 */,\n });\n }\n}\n","import { type AnyMessageContent } from '@fadzzzslebew/baileys';\nimport { Readable } from 'stream';\nimport { WhatsappSocketMessages, type WhatsappSocketMessagesProps } from './whatsappSocket.messages.ts';\nimport { MIME_TYPES } from './helpers.ts';\nexport { type WhatsappSocketMessagesProps as WhatsappSocketStreamProps } from './whatsappSocket.messages';\n\nexport class WhatsappSocketStream extends WhatsappSocketMessages {\n constructor(props: WhatsappSocketMessagesProps) {\n super(props);\n }\n\n protected async sendFileFromStream(\n to: string,\n stream: Readable | Buffer,\n options: {\n filename: string;\n mimetype?: string;\n caption?: string;\n replyToMessageId?: string;\n // File type specific options\n ptt?: boolean; // Push to talk (voice note)\n seconds?: number; // Duration for audio/video\n gifPlayback?: boolean; // For GIF videos\n // Additional options\n jpegThumbnail?: Buffer | string; // Thumbnail for videos/documents\n }\n ): Promise<any> {\n await this.ensureSocketConnected();\n\n const jid = WhatsappSocketStream.formatPhoneNumberToWhatsappPattern(to);\n\n // Convert stream to buffer if needed\n const buffer = stream instanceof Buffer ? stream : await this.streamToBuffer(stream as Readable);\n\n // Auto-detect mimetype if not provided\n const mimetype = options.mimetype || this.getMimetypeFromFilename(options.filename);\n\n // Determine message type based on mimetype\n const messageContent = await this.createFileMessage(buffer, mimetype, options);\n\n const messageOptions: any = {\n ...(options.replyToMessageId && {\n quoted: { key: { id: options.replyToMessageId } },\n }),\n };\n\n return this.socket?.sendMessage(jid, messageContent, messageOptions);\n }\n\n private async streamToBuffer(stream: Readable): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n stream.on('data', (chunk) => chunks.push(Buffer.from(chunk)));\n stream.on('error', (err) => reject(err));\n stream.on('end', () => resolve(Buffer.concat(chunks)));\n });\n }\n\n private getMimetypeFromFilename(filename: string): string {\n const ext = filename.split('.').pop()?.toLowerCase();\n return MIME_TYPES[ext || ''] || 'application/octet-stream';\n }\n\n private async createFileMessage(\n buffer: Buffer,\n mimetype: string,\n options: {\n filename: string;\n caption?: string;\n ptt?: boolean;\n seconds?: number;\n gifPlayback?: boolean;\n jpegThumbnail?: Buffer | string;\n }\n ): Promise<AnyMessageContent> {\n const [type] = mimetype.split('/');\n\n switch (type) {\n case 'image':\n return {\n image: buffer,\n caption: options.caption,\n mimetype,\n fileName: options.filename,\n };\n\n case 'video':\n return {\n video: buffer,\n caption: options.caption,\n mimetype,\n fileName: options.filename,\n gifPlayback: options.gifPlayback || false,\n jpegThumbnail: options.jpegThumbnail as string,\n ...(options.seconds && { seconds: options.seconds }),\n };\n\n case 'audio':\n if (options.ptt) {\n // Voice note\n return {\n audio: buffer,\n mimetype: 'audio/ogg; codecs=opus',\n ptt: true,\n ...(options.seconds && { seconds: options.seconds }),\n };\n }\n\n return {\n audio: buffer,\n mimetype,\n fileName: options.filename,\n ...(options.seconds && { seconds: options.seconds }),\n };\n\n default:\n // Document (PDF, DOC, etc.)\n return {\n document: buffer,\n mimetype,\n fileName: options.filename,\n caption: options.caption,\n jpegThumbnail: options.jpegThumbnail as string,\n };\n }\n }\n\n // Helper method to send specific file types\n protected async sendImage(\n to: string,\n imageBuffer: Buffer | Readable,\n options: {\n caption?: string;\n filename?: string;\n replyToMessageId?: string;\n } = {}\n ): Promise<any> {\n return this.sendFileFromStream(to, imageBuffer, {\n filename: options.filename || 'image.jpg',\n caption: options.caption,\n replyToMessageId: options.replyToMessageId,\n });\n }\n\n protected async sendVideo(\n to: string,\n videoBuffer: Buffer | Readable,\n options: {\n caption?: string;\n filename?: string;\n gifPlayback?: boolean;\n replyToMessageId?: string;\n jpegThumbnail?: Buffer;\n } = {}\n ): Promise<any> {\n return this.sendFileFromStream(to, videoBuffer, {\n filename: options.filename || 'video.mp4',\n caption: options.caption,\n gifPlayback: options.gifPlayback,\n replyToMessageId: options.replyToMessageId,\n jpegThumbnail: options.jpegThumbnail,\n });\n }\n\n protected async sendAudio(\n to: string,\n audioBuffer: Buffer | Readable,\n options: {\n filename?: string;\n ptt?: boolean; // Voice note\n seconds?: number;\n replyToMessageId?: string;\n } = {}\n ): Promise<any> {\n return this.sendFileFromStream(to, audioBuffer, {\n filename: options.filename || 'audio.mp3',\n mimetype: options.ptt ? 'audio/ogg; codecs=opus' : '',\n ptt: options.ptt,\n seconds: options.seconds,\n replyToMessageId: options.replyToMessageId,\n });\n }\n\n protected async sendDocument(\n to: string,\n documentBuffer: Buffer | Readable,\n options: {\n filename: string;\n caption?: string;\n mimetype?: string;\n replyToMessageId?: string;\n jpegThumbnail?: Buffer;\n }\n ): Promise<any> {\n return this.sendFileFromStream(to, documentBuffer, {\n filename: options.filename,\n mimetype: options.mimetype,\n caption: options.caption,\n replyToMessageId: options.replyToMessageId,\n jpegThumbnail: options.jpegThumbnail,\n });\n }\n\n protected async sendVoiceNote(\n to: string,\n audioBuffer: Buffer | Readable,\n options: {\n seconds?: number;\n replyToMessageId?: string;\n } = {}\n ): Promise<any> {\n return this.sendAudio(to, audioBuffer, {\n ptt: true,\n seconds: options.seconds,\n replyToMessageId: options.replyToMessageId,\n });\n }\n\n protected async sendSticker(\n to: string,\n stickerBuffer: Buffer | Readable,\n options: {\n replyToMessageId?: string;\n } = {}\n ): Promise<any> {\n await this.ensureSocketConnected();\n\n const jid = WhatsappSocketStream.formatPhoneNumberToWhatsappPattern(to);\n const buffer =\n stickerBuffer instanceof Buffer ? stickerBuffer : await this.streamToBuffer(stickerBuffer as Readable);\n\n const messageOptions: any = {\n ...(options.replyToMessageId && {\n quoted: { key: { id: options.replyToMessageId } },\n }),\n };\n\n return this.socket?.sendMessage(jid, { sticker: buffer }, messageOptions);\n }\n}\n","import { ReadStream } from 'node:fs';\n\nimport { WhatsappSocketStream, type WhatsappSocketStreamProps } from './whatsappSocket.stream';\nexport { type WhatsappSocketStreamProps as WhatsappSocketFilesProps } from './whatsappSocket.stream';\nimport { getAudioFileDuration, getFilenameFromStream, getUrlBuffer, streamToBuffer } from './helpers.ts';\nimport { basename } from 'node:path';\n\nexport class WhatsappSocketFiles extends WhatsappSocketStream {\n static DEFAULT_COUNTRY_CODE: string = '972';\n\n constructor(props: WhatsappSocketStreamProps) {\n super(props);\n }\n\n async sendImageMessage(\n to: string,\n imageSrc: string | Buffer<any> | ReadStream,\n { caption = '', filename }: { caption?: string; filename?: string } = {}\n ) {\n await this.ensureSocketConnected();\n\n const jid = WhatsappSocketFiles.formatPhoneNumberToWhatsappPattern(to);\n const imageData = typeof imageSrc === 'string' ? await getUrlBuffer(imageSrc) : imageSrc;\n\n if (this.debug) this.logger?.debug('WHATSAPP', 'send image message', { jid, caption, filename });\n return await this.sendImage(jid, imageData, { caption, ...(filename && { filename }) });\n }\n\n async sendVideoMessage(\n to: string,\n videoSrc: string | Buffer<any> | ReadStream,\n {\n caption = '',\n filename,\n sendAsGifPlayback: gifPlayback = false,\n }: { caption?: string; sendAsGifPlayback?: boolean; filename?: string } = {}\n ) {\n await this.ensureSocketConnected();\n\n const jid = WhatsappSocketFiles.formatPhoneNumberToWhatsappPattern(to);\n const videoBuffer = typeof videoSrc === 'string' ? await getUrlBuffer(videoSrc) : videoSrc;\n\n if (this.debug) this.logger?.debug('WHATSAPP', 'send video message', { jid, caption, filename, gifPlayback });\n return await this.sendVideo(jid, videoBuffer, { caption, gifPlayback, ...(filename && { filename }) });\n }\n\n async sendFileMessage(\n to: string,\n fileSrc: string | Buffer<any> | ReadStream,\n {\n caption = '',\n mimetype = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n replyToMessageId,\n jpegThumbnailSrc,\n filename: _filename,\n }: {\n caption?: string;\n mimetype?: string;\n filename?: string;\n replyToMessageId?: string;\n jpegThumbnailSrc?: string | Buffer<any> | ReadStream;\n } = {}\n ) {\n await this.ensureSocketConnected();\n\n const jid = WhatsappSocketFiles.formatPhoneNumberToWhatsappPattern(to);\n const fileBuffer = typeof fileSrc === 'string' ? await getUrlBuffer(fileSrc) : fileSrc;\n\n let jpegThumbnailBuffer: Buffer<any> | undefined;\n if (typeof jpegThumbnailSrc === 'string') {\n jpegThumbnailBuffer = await getUrlBuffer(jpegThumbnailSrc);\n } else if (jpegThumbnailSrc instanceof ReadStream) {\n jpegThumbnailBuffer = await streamToBuffer(jpegThumbnailSrc);\n } else {\n jpegThumbnailBuffer = jpegThumbnailSrc;\n }\n\n let filename = 'mu-document';\n if (fileSrc instanceof ReadStream) {\n const fname = getFilenameFromStream(fileSrc);\n if (fname) filename = fname;\n } else if (typeof fileSrc === 'string') {\n filename = basename(fileSrc);\n }\n\n if (this.debug)\n this.logger?.debug('WHATSAPP', 'send file message', {\n jid,\n caption,\n mimetype,\n filename,\n replyToMessageId,\n includeJpegThumbnail: !!jpegThumbnailBuffer,\n });\n return await this.sendDocument(jid, fileBuffer, {\n caption,\n mimetype,\n filename,\n replyToMessageId,\n jpegThumbnail: jpegThumbnailBuffer,\n });\n }\n\n async sendAudioMessage(\n to: string,\n audioSrc: string | Buffer<any> | ReadStream,\n {\n filename,\n replyToMessageId,\n mimetype,\n seconds,\n }: { filename?: string; replyToMessageId?: string; mimetype?: string; seconds?: number } = {}\n ) {\n await this.ensureSocketConnected();\n\n const jid = WhatsappSocketFiles.formatPhoneNumberToWhatsappPattern(to);\n const audioBuffer = typeof audioSrc === 'string' ? await getUrlBuffer(audioSrc) : audioSrc;\n let durationInSeconds = seconds || (await getAudioFileDuration(audioBuffer, mimetype).catch(() => 0));\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'send audio message', {\n jid,\n mimetype,\n filename,\n seconds: durationInSeconds,\n replyToMessageId,\n });\n }\n\n return await this.sendAudio(jid, audioBuffer, {\n ...(filename && { filename }),\n ...(mimetype && { mimetype: mimetype }),\n ...(durationInSeconds && { seconds: durationInSeconds }),\n ...(replyToMessageId && { replyToMessageId: replyToMessageId }),\n });\n }\n\n /**\n * requirements:\n * * format .webp\n * * imageSize 512pxx512px\n * * maxSize: 100kb\n * * transparent background\n * @param to\n * @param imageSrc\n * @param replyToMessageId\n */\n async sendStickerMessage(\n to: string,\n imageSrc: string | Buffer<any> | ReadStream,\n { replyToMessageId }: { replyToMessageId?: string } = {}\n ) {\n await this.ensureSocketConnected();\n\n const jid = WhatsappSocketFiles.formatPhoneNumberToWhatsappPattern(to);\n const stickerBuffer = typeof imageSrc === 'string' ? await getUrlBuffer(imageSrc) : imageSrc;\n\n if (this.debug) this.logger?.debug('WHATSAPP', 'send sticker message', { jid, replyToMessageId });\n await this.sendSticker(jid, stickerBuffer, { replyToMessageId });\n }\n}\n","import { WhatsappSocketFiles, type WhatsappSocketFilesProps } from './whatsappSocket.files';\n\nexport class WhatsappSocket extends WhatsappSocketFiles {\n constructor(props: WhatsappSocketFilesProps) {\n super(props);\n }\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -11,18 +11,19 @@ type WhatsappSocketBaseProps = ({
11
11
  mongoURL?: string;
12
12
  fileAuthStateDirectoryPath: string;
13
13
  }) & {
14
- logger?: any;
14
+ appName?: string;
15
+ logger?: Logger;
15
16
  mongoCollection?: string;
16
17
  onOpen?: () => Promise<void> | void;
17
18
  onClose?: () => Promise<void> | void;
18
19
  onConnectionStatusChange?: (connectionStatus: 'connecting' | 'close' | 'open') => Promise<void> | void;
19
20
  onReceiveMessages?: (messages: WAMessage[], type: MessageUpsertType) => Promise<void> | void;
21
+ onPreConnectionSendMessageFailed?: (error: Error | string) => Promise<void> | void;
20
22
  onQR?: (qr: string, code?: string | null) => Promise<void> | void;
21
23
  debug?: boolean;
22
24
  printQRInTerminal?: boolean;
23
25
  pairingPhone?: string;
24
26
  customPairingCode?: string;
25
- allowUseLastVersion?: boolean;
26
27
  };
27
28
  declare class WhatsappSocketBase {
28
29
  protected socket: null | WASocket;
@@ -34,7 +35,8 @@ declare class WhatsappSocketBase {
34
35
  protected readonly printQRInTerminal?: boolean;
35
36
  protected readonly pairingPhone?: string;
36
37
  protected readonly customPairingCode?: string;
37
- protected readonly allowUseLastVersion?: boolean;
38
+ protected readonly appName?: string;
39
+ private onPreConnectionSendMessageFailed?;
38
40
  private onOpen?;
39
41
  private onClose?;
40
42
  private onQR?;
@@ -60,7 +62,8 @@ declare class WhatsappSocketBase {
60
62
  [key: string]: any;
61
63
  }): Promise<string>;
62
64
  static randomPairingCode(pattern: string, length?: number): string;
63
- constructor({ fileAuthStateDirectoryPath, mongoURL, mongoCollection, logger, onOpen, onClose, onQR, onReceiveMessages, onConnectionStatusChange, debug, printQRInTerminal, pairingPhone, customPairingCode, allowUseLastVersion, }: WhatsappSocketBaseProps);
65
+ constructor({ fileAuthStateDirectoryPath, mongoURL, mongoCollection, logger, onOpen, onClose, onQR, onReceiveMessages, onConnectionStatusChange, debug, printQRInTerminal, pairingPhone, customPairingCode, onPreConnectionSendMessageFailed, appName, }: WhatsappSocketBaseProps);
66
+ private getLatestWhatsAppVersion;
64
67
  private getAuthCollection;
65
68
  private authenticate;
66
69
  startConnection({ options, connectionAttempts, onOpen, onClose, onQR, onConnectionStatusChange, pairingPhone: _pairingPhone, debug: _debug, }?: {
@@ -73,10 +76,12 @@ declare class WhatsappSocketBase {
73
76
  onQR?: (qr: string, code?: string | null) => Promise<void> | void;
74
77
  onConnectionStatusChange?: (status: 'open' | 'close' | 'connecting') => Promise<void> | void;
75
78
  }): Promise<WASocket | null>;
79
+ ensureSocketConnected(): Promise<WASocket | null>;
76
80
  closeConnection(): Promise<void>;
77
81
  clearAuthState(): Promise<void>;
78
- resetConnection({ pairingPhone }?: {
82
+ resetConnection({ pairingPhone, autoConnect }?: {
79
83
  pairingPhone?: string;
84
+ autoConnect?: boolean;
80
85
  }): Promise<void>;
81
86
  isConnected(): boolean;
82
87
  }
@@ -106,12 +111,14 @@ declare class WhatsappSocketMessages extends WhatsappSocketBase {
106
111
  sendReplyButtonsMessage(to: string, { title, subtitle, buttons, }: {
107
112
  title: string;
108
113
  subtitle?: string;
109
- buttons: string[];
114
+ buttons: Array<string | {
115
+ id: number | string;
116
+ label: string;
117
+ }>;
110
118
  }): Promise<any>;
111
119
  }
112
120
 
113
121
  declare class WhatsappSocketStream extends WhatsappSocketMessages {
114
- static DEFAULT_COUNTRY_CODE: string;
115
122
  constructor(props: WhatsappSocketBaseProps);
116
123
  protected sendFileFromStream(to: string, stream: Readable | Buffer, options: {
117
124
  filename: string;
package/dist/index.d.ts CHANGED
@@ -11,18 +11,19 @@ type WhatsappSocketBaseProps = ({
11
11
  mongoURL?: string;
12
12
  fileAuthStateDirectoryPath: string;
13
13
  }) & {
14
- logger?: any;
14
+ appName?: string;
15
+ logger?: Logger;
15
16
  mongoCollection?: string;
16
17
  onOpen?: () => Promise<void> | void;
17
18
  onClose?: () => Promise<void> | void;
18
19
  onConnectionStatusChange?: (connectionStatus: 'connecting' | 'close' | 'open') => Promise<void> | void;
19
20
  onReceiveMessages?: (messages: WAMessage[], type: MessageUpsertType) => Promise<void> | void;
21
+ onPreConnectionSendMessageFailed?: (error: Error | string) => Promise<void> | void;
20
22
  onQR?: (qr: string, code?: string | null) => Promise<void> | void;
21
23
  debug?: boolean;
22
24
  printQRInTerminal?: boolean;
23
25
  pairingPhone?: string;
24
26
  customPairingCode?: string;
25
- allowUseLastVersion?: boolean;
26
27
  };
27
28
  declare class WhatsappSocketBase {
28
29
  protected socket: null | WASocket;
@@ -34,7 +35,8 @@ declare class WhatsappSocketBase {
34
35
  protected readonly printQRInTerminal?: boolean;
35
36
  protected readonly pairingPhone?: string;
36
37
  protected readonly customPairingCode?: string;
37
- protected readonly allowUseLastVersion?: boolean;
38
+ protected readonly appName?: string;
39
+ private onPreConnectionSendMessageFailed?;
38
40
  private onOpen?;
39
41
  private onClose?;
40
42
  private onQR?;
@@ -60,7 +62,8 @@ declare class WhatsappSocketBase {
60
62
  [key: string]: any;
61
63
  }): Promise<string>;
62
64
  static randomPairingCode(pattern: string, length?: number): string;
63
- constructor({ fileAuthStateDirectoryPath, mongoURL, mongoCollection, logger, onOpen, onClose, onQR, onReceiveMessages, onConnectionStatusChange, debug, printQRInTerminal, pairingPhone, customPairingCode, allowUseLastVersion, }: WhatsappSocketBaseProps);
65
+ constructor({ fileAuthStateDirectoryPath, mongoURL, mongoCollection, logger, onOpen, onClose, onQR, onReceiveMessages, onConnectionStatusChange, debug, printQRInTerminal, pairingPhone, customPairingCode, onPreConnectionSendMessageFailed, appName, }: WhatsappSocketBaseProps);
66
+ private getLatestWhatsAppVersion;
64
67
  private getAuthCollection;
65
68
  private authenticate;
66
69
  startConnection({ options, connectionAttempts, onOpen, onClose, onQR, onConnectionStatusChange, pairingPhone: _pairingPhone, debug: _debug, }?: {
@@ -73,10 +76,12 @@ declare class WhatsappSocketBase {
73
76
  onQR?: (qr: string, code?: string | null) => Promise<void> | void;
74
77
  onConnectionStatusChange?: (status: 'open' | 'close' | 'connecting') => Promise<void> | void;
75
78
  }): Promise<WASocket | null>;
79
+ ensureSocketConnected(): Promise<WASocket | null>;
76
80
  closeConnection(): Promise<void>;
77
81
  clearAuthState(): Promise<void>;
78
- resetConnection({ pairingPhone }?: {
82
+ resetConnection({ pairingPhone, autoConnect }?: {
79
83
  pairingPhone?: string;
84
+ autoConnect?: boolean;
80
85
  }): Promise<void>;
81
86
  isConnected(): boolean;
82
87
  }
@@ -106,12 +111,14 @@ declare class WhatsappSocketMessages extends WhatsappSocketBase {
106
111
  sendReplyButtonsMessage(to: string, { title, subtitle, buttons, }: {
107
112
  title: string;
108
113
  subtitle?: string;
109
- buttons: string[];
114
+ buttons: Array<string | {
115
+ id: number | string;
116
+ label: string;
117
+ }>;
110
118
  }): Promise<any>;
111
119
  }
112
120
 
113
121
  declare class WhatsappSocketStream extends WhatsappSocketMessages {
114
- static DEFAULT_COUNTRY_CODE: string;
115
122
  constructor(props: WhatsappSocketBaseProps);
116
123
  protected sendFileFromStream(to: string, stream: Readable | Buffer, options: {
117
124
  filename: string;
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- import ae,{ReadStream}from'fs';import te,{generateWAMessageFromContent,WAProto,useMultiFileAuthState,makeCacheableSignalKeyStore,fetchLatestBaileysVersion,DisconnectReason,initAuthCreds}from'@fadzzzslebew/baileys';import N from'ms';import E from'qrcode';import {MongoClient}from'mongodb';import ce from'pino';import {parseStream,parseBuffer}from'music-metadata';import {basename}from'path';var O={replacer:(o,e)=>Buffer.isBuffer(e)||e instanceof Uint8Array||e?.type==="Buffer"?{type:"Buffer",data:Buffer.from(e?.data||e).toString("base64")}:e,reviver:(o,e)=>{if(typeof e=="object"&&e&&(e.buffer===true||e.type==="Buffer")){let t=e.data||e.value;return typeof t=="string"?Buffer.from(t,"base64"):Buffer.from(t||[])}return e}},Y=async o=>{let e=(s,a)=>{let i={$set:{...JSON.parse(JSON.stringify(s,O.replacer))}};return o.updateOne({_id:a},i,{upsert:true})},t=async s=>{try{let a=JSON.stringify(await o.findOne({_id:s}));return JSON.parse(a,O.reviver)}catch{return null}},n=async s=>{try{await o.deleteOne({_id:s});}catch{}},r=await t("creds")||initAuthCreds();return {state:{creds:r,keys:{get:async(s,a)=>{let c={};return await Promise.all(a.map(async i=>{let g=await t(`${s}-${i}`);s==="app-state-sync-key"&&g&&(g=WAProto.Message.AppStateSyncKeyData.fromObject(g)),c[i]=g;})),c},set:async s=>{let a=[];for(let c of Object.keys(s))for(let i of Object.keys(s[c])){let g=s[c][i],u=`${c}-${i}`;a.push(g?e(g,u):n(u));}await Promise.all(a);}}},saveCreds:()=>e(r,"creds")}},U=Y;var F=o=>N(o)/1e3;async function f(o){let t=await(await fetch(o)).arrayBuffer();return Buffer.from(t)}async function Z(o,e){try{let t=await parseStream(o,{mimeType:e||"audio/mpeg"});return Math.floor(t.format.duration||0)}catch(t){throw console.error("Error parsing stream:",t),t}finally{o.destroyed||o.destroy();}}async function ee(o,e){try{let t=await parseBuffer(o,e||"audio/mpeg").catch(()=>null);return t?Math.floor(t.format.duration||0):0}catch(t){throw console.error("Error parsing buffer:",t),t}}async function I(o,e){return o instanceof ReadStream?Z(o,e):ee(o,e)}async function L(o){let e=[];for await(let t of o)e.push(t);return Buffer.concat(e)}function H(o){if(o.path){let e=o.path.toString();return basename(e)}}var j=o=>new Promise(e=>setTimeout(e,N(o)));var V=ce({level:"silent"}),A=class o{socket;fileAuthStateDirectoryPath;mongoURL;mongoCollection="whatsapp-auth";logger;debug;printQRInTerminal;pairingPhone;customPairingCode;allowUseLastVersion;onOpen;onClose;onQR;onConnectionStatusChange;onReceiveMessages;static DEFAULT_COUNTRY_CODE="972";static CONNECTION_TIMEOUT="2s";static formatPhoneNumber(e,t=o.DEFAULT_COUNTRY_CODE){if(e.endsWith("@s.whatsapp.net"))return e;let n=e.replace(/[^0-9]/g,"");return n.startsWith("05")&&(n=n.substring(1)),n.startsWith(t)||(n=t+n),n}static formatPhoneNumberToWhatsappPattern(e,t=o.DEFAULT_COUNTRY_CODE){if(e.endsWith("@s.whatsapp.net"))return e;let n=o.formatPhoneNumber(e,t);return n=`${n}@s.whatsapp.net`,n}static getWhatsappPhoneLink({phone:e,message:t,countryCode:n=this.DEFAULT_COUNTRY_CODE}){let r=this.formatPhoneNumber(e,n),s={...t&&{text:encodeURI(t)}};return `https://wa.me/${r}?${s}`}static async qrToImage(e,t={}){return E.toDataURL(e,{errorCorrectionLevel:"H",width:400,margin:2,...t})}static async qrToTerminalString(e,t={}){return E.toString(e,{type:"terminal",small:true,...t})}static randomPairingCode(e,t=8){if(!e.includes("[")&&e.length===t)return e;let n="",r=[],s=c=>{let i=[];for(let g=0;g<c.length;g++)if(c[g+1]==="-"&&c[g+2]){let u=c.charCodeAt(g),m=c.charCodeAt(g+2);for(let l=u;l<=m;l++)i.push(String.fromCharCode(l));g+=2;}else i.push(c[g]);return i};for(let c=0;c<e.length&&n.length<t;c++){let i=e[c];if(i==="["){let g=e.indexOf("]",c),u=e.slice(c+1,g);r=s(u),c=g;}else n+=i;}for(;n.length<t&&r.length;)n+=r[Math.floor(Math.random()*r.length)];let a=n.toUpperCase();return a.padEnd(t,a)}constructor({fileAuthStateDirectoryPath:e,mongoURL:t,mongoCollection:n="whatsapp-auth",logger:r,onOpen:s,onClose:a,onQR:c,onReceiveMessages:i,onConnectionStatusChange:g,debug:u,printQRInTerminal:m,pairingPhone:l,customPairingCode:b,allowUseLastVersion:T=true}){this.mongoURL=t,this.fileAuthStateDirectoryPath=e,this.mongoCollection=n,this.logger=r,this.debug=u,this.printQRInTerminal=m,this.pairingPhone=l,this.customPairingCode=b,this.allowUseLastVersion=T,this.onConnectionStatusChange=g,this.socket=null,this.onReceiveMessages=i,this.onOpen=s,this.onClose=a,this.onQR=c;}async getAuthCollection(){if(!this.mongoURL)return [];let e=new MongoClient(this.mongoURL);return await e.connect(),[e.db().collection(this.mongoCollection),e]}async authenticate(){if(!this.mongoURL&&!this.fileAuthStateDirectoryPath)throw new Error("fileAuthStateDirectoryPath/MongoURL is missing");if(!this.mongoURL){let{saveCreds:s,state:a}=await useMultiFileAuthState(this.fileAuthStateDirectoryPath);return {auth:a,saveCreds:s}}let[e]=await this.getAuthCollection(),{state:t,saveCreds:n}=await U(e);return {auth:{creds:t.creds,keys:makeCacheableSignalKeyStore(t.keys,V)},saveCreds:n}}async startConnection({options:e,connectionAttempts:t=3,onOpen:n=this.onOpen,onClose:r=this.onClose,onQR:s=this.onQR,onConnectionStatusChange:a=this.onConnectionStatusChange,pairingPhone:c,debug:i}={}){let g=c??this.pairingPhone,{saveCreds:u,auth:m}=await this.authenticate(),l=i===void 0?this.debug:i,{version:b,isLatest:T}=await fetchLatestBaileysVersion();this.allowUseLastVersion&&!T&&l&&this.logger?.warn("WHATSAPP","current baileys service is not the latest version!",{version:b,isLatest:T});let x=async()=>new Promise(R=>{let y=te({version:this.allowUseLastVersion?b:[2,3e3,1027934701],logger:V,browser:["Ubuntu","Chrome","20.0.04"],syncFullHistory:false,shouldSyncHistoryMessage:()=>false,shouldIgnoreJid:h=>h.includes("@newsletter"),...e,printQRInTerminal:false,auth:m});y.ev.on("connection.update",async h=>{let{connection:C,lastDisconnect:W,qr:w}=h;if(w){if(l&&this.logger?.info("WHATSAPP","QR Code received",{qr:w}),this.printQRInTerminal){let Q=await o.qrToTerminalString(w,{small:true}).catch(()=>null);console.log(Q);}this.customPairingCode?o.randomPairingCode(this.customPairingCode):void 0;let P=g?o.formatPhoneNumber(g):null,S=P?await y.requestPairingCode(P):null;l&&this.printQRInTerminal&&this.logger?.info("WHATSAPP","QR Pairing Code",{code:S,pairingPhone:P}),await s?.(w,S);}switch(C){case "connecting":{l&&this.logger?.debug("WHATSAPP","Connecting..."),a?.("connecting");break}case "open":{l&&this.logger?.info("WHATSAPP","Connection opened successfully!"),this.socket=y,await n?.(),a?.("open"),R(this.socket);break}case "close":{let D=t-- >0&&W?.error?.output?.statusCode!==DisconnectReason.loggedOut,P=W?.error?.output?.statusCode,S=W?.error?.message;l&&this.logger?.info("WHATSAPP","Connection closed",{statusCode:P,errorMessage:S,shouldReconnect:D}),D&&t?(l&&this.logger?.info("WHATSAPP","Reconnecting..."),await j(o.CONNECTION_TIMEOUT),R(x())):(l&&this.logger?.warn("WHATSAPP","Logged out, clearing auth state"),await r?.(),this.socket=null,R(this.socket)),a?.("close");break}}}),y.ev.on("creds.update",u),this.onReceiveMessages&&typeof this.onReceiveMessages=="function"&&y.ev.on("messages.upsert",async({messages:h,type:C})=>{this.logger?.info("WHATSAPP","Received messages",{type:C,totalMessages:h.length}),this.onReceiveMessages?.(h,C);});});return await x()}async closeConnection(){this.socket&&(this.debug&&this.logger?.info("WHATSAPP","Closing connection"),this.socket.end(void 0),this.socket=null);}async clearAuthState(){if(this.mongoURL){let[e,t]=await this.getAuthCollection();this.debug&&this.logger?.info("WHATSAPP","Deleting auth state, required to scanning QR again"),await e?.deleteMany({}),await t?.close();}else this.fileAuthStateDirectoryPath&&ae.rmSync(this.fileAuthStateDirectoryPath,{recursive:true,force:true});}async resetConnection({pairingPhone:e}={}){await this.closeConnection(),await this.clearAuthState(),await new Promise(t=>setTimeout(t,2e3)),await this.startConnection({pairingPhone:e});}isConnected(){return this.socket!==null&&this.socket.user!==void 0}};var B=class o extends A{static DEFAULT_COUNTRY_CODE="972";constructor(e){super(e);}async sendTextMessage(e,t,n){this.socket||(this.debug&&this.logger?.warn("WHATSAPP","Client not connected, attempting to connect..."),this.socket=await this.startConnection());let r=o.formatPhoneNumberToWhatsappPattern(e),s={...n&&{quoted:{key:{id:n}}}};return this.socket?.sendMessage(r,{text:t},s)}async sendButtonsMessage(e,{subtitle:t,title:n,buttons:r}){if(!n||!r.length)throw new Error("sendButtonsMessage: No title or buttons required field found.");this.socket||(this.debug&&this.logger?.warn("WHATSAPP","Client not connected, attempting to connect..."),this.socket=await this.startConnection());let s=o.formatPhoneNumberToWhatsappPattern(e),a=r?.map(i=>{let g={display_text:i.label},u;switch(true){case !!i.url:u="cta_url",g.url=i.url;break;case !!i.copy:u="cta_copy",g.copy_code=i.copy;break;case !!i.tel:u="cta_call",g.phone_number=i.tel;break;case !!i.email:u="cta_email",g.email=i.email;break;case !!(i.reminderOn||i.reminderDate):u="cta_reminder";let{reminderOn:m,reminderDate:l}=i;g.reminder_name=i.reminderName,g.reminder_timestamp=l?Math.floor(+new Date(l)/1e3):Math.floor(Date.now()/1e3)+F(m??"0s");break;default:u="";break}return {name:u,buttonParamsJson:JSON.stringify(g)}}).filter(i=>i.name),c=generateWAMessageFromContent(s,{viewOnceMessage:{message:{interactiveMessage:WAProto.Message.InteractiveMessage.create({...n&&{body:WAProto.Message.InteractiveMessage.Body.create({text:n})},...t&&{footer:WAProto.Message.InteractiveMessage.Footer.create({text:t})},...!!a?.length&&{nativeFlowMessage:WAProto.Message.InteractiveMessage.NativeFlowMessage.create({buttons:a})}})}}},{userJid:s});return this.debug&&this.logger?.debug("WHATSAPP","send buttons message",{jid:s,footer:t,body:n,buttons:a}),this.socket?.relayMessage(s,c.message,{messageId:c.key.id})}async sendReplyButtonsMessage(e,{title:t,subtitle:n,buttons:r}){if(!t||!r.length)throw new Error("sendReplyButtonsMessage: No title or buttons required field found.");this.socket||(this.debug&&this.logger?.warn("WHATSAPP","Client not connected, attempting to connect..."),this.socket=await this.startConnection());let s=o.formatPhoneNumberToWhatsappPattern(e),a=r.filter(c=>c).map((c,i)=>({buttonId:`id${i}`,buttonText:{displayText:c},type:1}));return this.debug&&this.logger?.debug("WHATSAPP","send reply buttons message",{jid:s,text:t,footer:n,buttons:a}),this.socket?.sendMessage(s,{text:t,...n&&{footer:n},buttons:a})}};var M=class o extends B{static DEFAULT_COUNTRY_CODE="972";constructor(e){super(e);}async sendFileFromStream(e,t,n){this.socket||(this.debug&&this.logger?.warn("WHATSAPP","Client not connected, attempting to connect..."),this.socket=await this.startConnection());let r=o.formatPhoneNumberToWhatsappPattern(e),s=t instanceof Buffer?t:await this.streamToBuffer(t),a=n.mimetype||this.getMimetypeFromFilename(n.filename),c=await this.createFileMessage(s,a,n),i={...n.replyToMessageId&&{quoted:{key:{id:n.replyToMessageId}}}};return this.socket?.sendMessage(r,c,i)}async streamToBuffer(e){return new Promise((t,n)=>{let r=[];e.on("data",s=>r.push(Buffer.from(s))),e.on("error",s=>n(s)),e.on("end",()=>t(Buffer.concat(r)));})}getMimetypeFromFilename(e){let t=e.split(".").pop()?.toLowerCase();return {jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",gif:"image/gif",webp:"image/webp",bmp:"image/bmp",svg:"image/svg+xml",mp4:"video/mp4",avi:"video/x-msvideo",mov:"video/quicktime",mkv:"video/x-matroska",webm:"video/webm",mp3:"audio/mpeg",wav:"audio/wav",ogg:"audio/ogg",opus:"audio/opus",aac:"audio/aac",m4a:"audio/mp4",pdf:"application/pdf",doc:"application/msword",docx:"application/vnd.openxmlformats-officedocument.wordprocessingml.document",xls:"application/vnd.ms-excel",xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",ppt:"application/vnd.ms-powerpoint",pptx:"application/vnd.openxmlformats-officedocument.presentationml.presentation",txt:"text/plain",zip:"application/zip",rar:"application/x-rar-compressed","7z":"application/x-7z-compressed"}[t||""]||"application/octet-stream"}async createFileMessage(e,t,n){let[r]=t.split("/");switch(r){case "image":return {image:e,caption:n.caption,mimetype:t,fileName:n.filename};case "video":return {video:e,caption:n.caption,mimetype:t,fileName:n.filename,gifPlayback:n.gifPlayback||false,jpegThumbnail:n.jpegThumbnail,...n.seconds&&{seconds:n.seconds}};case "audio":return n.ptt?{audio:e,mimetype:"audio/ogg; codecs=opus",ptt:true,...n.seconds&&{seconds:n.seconds}}:{audio:e,mimetype:t,fileName:n.filename,...n.seconds&&{seconds:n.seconds}};default:return {document:e,mimetype:t,fileName:n.filename,caption:n.caption,jpegThumbnail:n.jpegThumbnail}}}async sendImage(e,t,n={}){return this.sendFileFromStream(e,t,{filename:n.filename||"image.jpg",caption:n.caption,replyToMessageId:n.replyToMessageId})}async sendVideo(e,t,n={}){return this.sendFileFromStream(e,t,{filename:n.filename||"video.mp4",caption:n.caption,gifPlayback:n.gifPlayback,replyToMessageId:n.replyToMessageId,jpegThumbnail:n.jpegThumbnail})}async sendAudio(e,t,n={}){return this.sendFileFromStream(e,t,{filename:n.filename||"audio.mp3",mimetype:n.ptt?"audio/ogg; codecs=opus":"",ptt:n.ptt,seconds:n.seconds,replyToMessageId:n.replyToMessageId})}async sendDocument(e,t,n){return this.sendFileFromStream(e,t,{filename:n.filename,mimetype:n.mimetype,caption:n.caption,replyToMessageId:n.replyToMessageId,jpegThumbnail:n.jpegThumbnail})}async sendVoiceNote(e,t,n={}){return this.sendAudio(e,t,{ptt:true,seconds:n.seconds,replyToMessageId:n.replyToMessageId})}async sendSticker(e,t,n={}){this.socket||(this.debug&&this.logger?.warn("WHATSAPP","Client not connected, attempting to connect..."),this.socket=await this.startConnection());let r=o.formatPhoneNumberToWhatsappPattern(e),s=t instanceof Buffer?t:await this.streamToBuffer(t),a={...n.replyToMessageId&&{quoted:{key:{id:n.replyToMessageId}}}};return this.socket?.sendMessage(r,{sticker:s},a)}};var v=class o extends M{static DEFAULT_COUNTRY_CODE="972";constructor(e){super(e);}async sendImageMessage(e,t,{caption:n="",filename:r}={}){this.socket||(this.debug&&this.logger?.warn("WHATSAPP","Client not connected, attempting to connect..."),this.socket=await this.startConnection());let s=o.formatPhoneNumberToWhatsappPattern(e),a=typeof t=="string"?await f(t):t;return this.debug&&this.logger?.debug("WHATSAPP","send image message",{jid:s,caption:n,filename:r}),await super.sendImage(s,a,{caption:n,...r&&{filename:r}})}async sendVideoMessage(e,t,{caption:n="",filename:r,sendAsGifPlayback:s=false}={}){this.socket||(this.debug&&this.logger?.warn("WHATSAPP","Client not connected, attempting to connect..."),this.socket=await this.startConnection());let a=o.formatPhoneNumberToWhatsappPattern(e),c=typeof t=="string"?await f(t):t;return this.debug&&this.logger?.debug("WHATSAPP","send video message",{jid:a,caption:n,filename:r,gifPlayback:s}),await super.sendVideo(a,c,{caption:n,gifPlayback:s,...r&&{filename:r}})}async sendFileMessage(e,t,{caption:n="",mimetype:r="application/vnd.openxmlformats-officedocument.wordprocessingml.document",replyToMessageId:s,jpegThumbnailSrc:a,filename:c}={}){this.socket||(this.debug&&this.logger?.warn("WHATSAPP","Client not connected, attempting to connect..."),this.socket=await this.startConnection());let i=o.formatPhoneNumberToWhatsappPattern(e),g=typeof t=="string"?await f(t):t,u;typeof a=="string"?u=await f(a):a instanceof ReadStream?u=await L(a):u=a;let m="mu-document";if(t instanceof ReadStream){let l=H(t);l&&(m=l);}else typeof t=="string"&&(m=basename(t));return this.debug&&this.logger?.debug("WHATSAPP","send file message",{jid:i,caption:n,mimetype:r,filename:m,replyToMessageId:s,includeJpegThumbnail:!!u}),await super.sendDocument(i,g,{caption:n,mimetype:r,filename:m,replyToMessageId:s,jpegThumbnail:u})}async sendAudioMessage(e,t,{filename:n,replyToMessageId:r,mimetype:s,seconds:a}={}){this.socket||(this.debug&&this.logger?.warn("WHATSAPP","Client not connected, attempting to connect..."),this.socket=await this.startConnection());let c=o.formatPhoneNumberToWhatsappPattern(e),i=typeof t=="string"?await f(t):t,g=a||await I(i,s).catch(()=>0);return this.debug&&this.logger?.debug("WHATSAPP","send audio message",{jid:c,mimetype:s,filename:n,seconds:g,replyToMessageId:r}),await super.sendAudio(c,i,{...n&&{filename:n},...s&&{mimetype:s},...g&&{seconds:g},...r&&{replyToMessageId:r}})}async sendStickerMessage(e,t,{replyToMessageId:n}={}){this.socket||(this.debug&&this.logger?.warn("WHATSAPP","Client not connected, attempting to connect..."),this.socket=await this.startConnection());let r=o.formatPhoneNumberToWhatsappPattern(e),s=typeof t=="string"?await f(t):t;this.debug&&this.logger?.debug("WHATSAPP","send sticker message",{jid:r,replyToMessageId:n}),await super.sendSticker(r,s,{replyToMessageId:n});}};var q=class extends v{constructor(e){super(e);}};
2
- export{q as WhatsappSocket};//# sourceMappingURL=index.js.map
1
+ import ae,{ReadStream}from'fs';import ne,{generateWAMessageFromContent,WAProto,useMultiFileAuthState,makeCacheableSignalKeyStore,DisconnectReason,initAuthCreds}from'@fadzzzslebew/baileys';import F from'ms';import _ from'qrcode';import {MongoClient}from'mongodb';import ce from'pino';import {parseStream,parseBuffer}from'music-metadata';import {basename}from'path';var O={replacer:(o,e)=>Buffer.isBuffer(e)||e instanceof Uint8Array||e?.type==="Buffer"?{type:"Buffer",data:Buffer.from(e?.data||e).toString("base64")}:e,reviver:(o,e)=>{if(typeof e=="object"&&e&&(e.buffer===true||e.type==="Buffer")){let t=e.data||e.value;return typeof t=="string"?Buffer.from(t,"base64"):Buffer.from(t||[])}return e}},z=async o=>{let e=(s,a)=>{let i={$set:{...JSON.parse(JSON.stringify(s,O.replacer))}};return o.updateOne({_id:a},i,{upsert:true})},t=async s=>{try{let a=JSON.stringify(await o.findOne({_id:s}));return JSON.parse(a,O.reviver)}catch{return null}},n=async s=>{try{await o.deleteOne({_id:s});}catch{}},r=await t("creds")||initAuthCreds();return {state:{creds:r,keys:{get:async(s,a)=>{let c={};return await Promise.all(a.map(async i=>{let g=await t(`${s}-${i}`);s==="app-state-sync-key"&&g&&(g=WAProto.Message.AppStateSyncKeyData.fromObject(g)),c[i]=g;})),c},set:async s=>{let a=[];for(let c of Object.keys(s))for(let i of Object.keys(s[c])){let g=s[c][i],u=`${c}-${i}`;a.push(g?e(g,u):n(u));}await Promise.all(a);}}},saveCreds:()=>e(r,"creds")}},I=z;var U=o=>F(o)/1e3;async function f(o){let t=await(await fetch(o)).arrayBuffer();return Buffer.from(t)}async function ee(o,e){try{let t=await parseStream(o,{mimeType:e||"audio/mpeg"});return Math.floor(t.format.duration||0)}catch(t){throw console.error("Error parsing stream:",t),t}finally{o.destroyed||o.destroy();}}async function te(o,e){try{let t=await parseBuffer(o,e||"audio/mpeg").catch(()=>null);return t?Math.floor(t.format.duration||0):0}catch(t){throw console.error("Error parsing buffer:",t),t}}async function E(o,e){return o instanceof ReadStream?ee(o,e):te(o,e)}async function L(o){let e=[];for await(let t of o)e.push(t);return Buffer.concat(e)}function j(o){if(o.path){let e=o.path.toString();return basename(e)}}var M=o=>new Promise(e=>setTimeout(e,F(o))),H={jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",gif:"image/gif",webp:"image/webp",bmp:"image/bmp",svg:"image/svg+xml",mp4:"video/mp4",avi:"video/x-msvideo",mov:"video/quicktime",mkv:"video/x-matroska",webm:"video/webm",mp3:"audio/mpeg",wav:"audio/wav",ogg:"audio/ogg",opus:"audio/opus",aac:"audio/aac",m4a:"audio/mp4",pdf:"application/pdf",doc:"application/msword",docx:"application/vnd.openxmlformats-officedocument.wordprocessingml.document",xls:"application/vnd.ms-excel",xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",ppt:"application/vnd.ms-powerpoint",pptx:"application/vnd.openxmlformats-officedocument.presentationml.presentation",txt:"text/plain",zip:"application/zip",rar:"application/x-rar-compressed","7z":"application/x-7z-compressed"};var q=ce({level:"silent"}),w=class o{socket;fileAuthStateDirectoryPath;mongoURL;mongoCollection="whatsapp-auth";logger;debug;printQRInTerminal;pairingPhone;customPairingCode;appName;onPreConnectionSendMessageFailed;onOpen;onClose;onQR;onConnectionStatusChange;onReceiveMessages;static DEFAULT_COUNTRY_CODE="972";static CONNECTION_TIMEOUT="2s";static formatPhoneNumber(e,t=o.DEFAULT_COUNTRY_CODE){if(e.endsWith("@s.whatsapp.net"))return e;let n=e.replace(/[^0-9]/g,"");return n.startsWith("05")&&(n=n.substring(1)),n.startsWith(t)||(n=t+n),n}static formatPhoneNumberToWhatsappPattern(e,t=o.DEFAULT_COUNTRY_CODE){if(e.endsWith("@s.whatsapp.net"))return e;let n=o.formatPhoneNumber(e,t);return n=`${n}@s.whatsapp.net`,n}static getWhatsappPhoneLink({phone:e,message:t,countryCode:n=this.DEFAULT_COUNTRY_CODE}){let r=this.formatPhoneNumber(e,n),s={...t&&{text:encodeURI(t)}};return `https://wa.me/${r}?${s}`}static async qrToImage(e,t={}){return _.toDataURL(e,{errorCorrectionLevel:"H",width:400,margin:2,...t})}static async qrToTerminalString(e,t={}){return _.toString(e,{type:"terminal",small:true,...t})}static randomPairingCode(e,t=8){if(!e.includes("[")&&e.length===t)return e;let n="",r=[],s=c=>{let i=[];for(let g=0;g<c.length;g++)if(c[g+1]==="-"&&c[g+2]){let u=c.charCodeAt(g),d=c.charCodeAt(g+2);for(let m=u;m<=d;m++)i.push(String.fromCharCode(m));g+=2;}else i.push(c[g]);return i};for(let c=0;c<e.length&&n.length<t;c++){let i=e[c];if(i==="["){let g=e.indexOf("]",c),u=e.slice(c+1,g);r=s(u),c=g;}else n+=i;}for(;n.length<t&&r.length;)n+=r[Math.floor(Math.random()*r.length)];let a=n.toUpperCase();return a.padEnd(t,a)}constructor({fileAuthStateDirectoryPath:e,mongoURL:t,mongoCollection:n="whatsapp-auth",logger:r,onOpen:s,onClose:a,onQR:c,onReceiveMessages:i,onConnectionStatusChange:g,debug:u,printQRInTerminal:d,pairingPhone:m,customPairingCode:R,onPreConnectionSendMessageFailed:b,appName:W}){this.appName=W,this.mongoURL=t,this.fileAuthStateDirectoryPath=e,this.mongoCollection=n,this.logger=r,this.debug=u,this.printQRInTerminal=d,this.pairingPhone=m,this.customPairingCode=R,this.socket=null,this.onPreConnectionSendMessageFailed=b,this.onConnectionStatusChange=g,this.onReceiveMessages=i,this.onOpen=s,this.onClose=a,this.onQR=c;}async getLatestWhatsAppVersion(){try{let e=["https://raw.githubusercontent.com/WhiskeySockets/Baileys/master/src/Defaults/baileys-version.json","https://raw.githubusercontent.com/whiskeysockets/baileys/master/src/Defaults/baileys-version.json"];for(let t of e)try{let n=await fetch(t);if(n.ok)return (await n.json()).version}catch{continue}return console.log("Could not fetch version, using fallback"),[2,3e3,1015901307]}catch(e){return console.error("Error fetching version:",e),[2,3e3,1015901307]}}async getAuthCollection(){if(!this.mongoURL)return [];let e=new MongoClient(this.mongoURL);return await e.connect(),[e.db().collection(this.mongoCollection),e]}async authenticate(){if(!this.mongoURL&&!this.fileAuthStateDirectoryPath)throw new Error("fileAuthStateDirectoryPath/MongoURL is missing");if(!this.mongoURL){let{saveCreds:s,state:a}=await useMultiFileAuthState(this.fileAuthStateDirectoryPath);return {auth:a,saveCreds:s}}let[e]=await this.getAuthCollection(),{state:t,saveCreds:n}=await I(e);return {auth:{creds:t.creds,keys:makeCacheableSignalKeyStore(t.keys,q)},saveCreds:n}}async startConnection({options:e,connectionAttempts:t=3,onOpen:n=this.onOpen,onClose:r=this.onClose,onQR:s=this.onQR,onConnectionStatusChange:a=this.onConnectionStatusChange,pairingPhone:c,debug:i}={}){let g=c??this.pairingPhone,{saveCreds:u,auth:d}=await this.authenticate(),m=i===void 0?this.debug:i,R=await this.getLatestWhatsAppVersion(),b=async()=>new Promise(N=>{let y=ne({version:R,logger:q,browser:[this.appName||"baileys","1.0.0",""],syncFullHistory:false,shouldSyncHistoryMessage:()=>false,shouldIgnoreJid:h=>h.includes("@newsletter"),...e,printQRInTerminal:false,auth:d});y.ev.on("connection.update",async h=>{let{connection:S,lastDisconnect:x,qr:T}=h;if(T){if(m&&this.logger?.info("WHATSAPP","QR Code received",{qr:T}),this.printQRInTerminal){let J=await o.qrToTerminalString(T,{small:true}).catch(()=>null);console.log(J);}this.customPairingCode?o.randomPairingCode(this.customPairingCode):void 0;let P=g?o.formatPhoneNumber(g):null,C=P?await y.requestPairingCode(P):null;m&&this.printQRInTerminal&&this.logger?.info("WHATSAPP","QR Pairing Code",{code:C,pairingPhone:P}),await s?.(T,C);}switch(S){case "connecting":{m&&this.logger?.debug("WHATSAPP","Connecting..."),a?.("connecting");break}case "open":{m&&this.logger?.info("WHATSAPP","Connection opened successfully!"),this.socket=y,await n?.(),a?.("open"),N(this.socket);break}case "close":{let D=t-- >0&&x?.error?.output?.statusCode!==DisconnectReason.loggedOut,P=x?.error?.output?.statusCode,C=x?.error?.message;m&&this.logger?.info("WHATSAPP","Connection closed",{statusCode:P,errorMessage:C,shouldReconnect:D}),D&&t?(m&&this.logger?.info("WHATSAPP","Reconnecting..."),await M(o.CONNECTION_TIMEOUT),N(b())):(m&&this.logger?.warn("WHATSAPP","Logged out, clearing auth state"),await r?.(),this.socket=null,N(this.socket)),a?.("close");break}}}),y.ev.on("creds.update",u),this.onReceiveMessages&&typeof this.onReceiveMessages=="function"&&y.ev.on("messages.upsert",async({messages:h,type:S})=>{this.logger?.info("WHATSAPP","Received messages",{type:S,totalMessages:h.length}),this.onReceiveMessages?.(h,S);});}),W=await b();return await M(o.CONNECTION_TIMEOUT),W}async ensureSocketConnected(){return this.socket||(this.debug&&this.logger?.warn("WHATSAPP","Client not connected, attempting to connect..."),this.socket=await this.startConnection().catch(e=>(this.onPreConnectionSendMessageFailed?.(e),null))),this.socket}async closeConnection(){this.socket&&(this.debug&&this.logger?.info("WHATSAPP","Closing connection"),this.socket.end(void 0),this.socket=null);}async clearAuthState(){if(await this.closeConnection(),this.mongoURL){let[e,t]=await this.getAuthCollection();this.debug&&this.logger?.info("WHATSAPP","Deleting auth state, required to scanning QR again"),await e?.deleteMany({}),await t?.close();}else this.fileAuthStateDirectoryPath&&ae.rmSync(this.fileAuthStateDirectoryPath,{recursive:true,force:true});}async resetConnection({pairingPhone:e,autoConnect:t=true}={}){await this.clearAuthState(),t&&(await M(o.CONNECTION_TIMEOUT),await this.startConnection({pairingPhone:e}));}isConnected(){return this.socket!==null&&this.socket.user!==void 0}};var B=class o extends w{static DEFAULT_COUNTRY_CODE="972";constructor(e){super(e);}async sendTextMessage(e,t,n){await this.ensureSocketConnected();let r=o.formatPhoneNumberToWhatsappPattern(e),s={...n&&{quoted:{key:{id:n}}}};return this.socket?.sendMessage(r,{text:t},s)}async sendButtonsMessage(e,{subtitle:t,title:n,buttons:r}){if(!n||!r.length)throw new Error("sendButtonsMessage: No title or buttons required field found.");await this.ensureSocketConnected();let s=o.formatPhoneNumberToWhatsappPattern(e),a=r?.map(i=>{let g={display_text:i.label},u;switch(true){case !!i.url:u="cta_url",g.url=i.url;break;case !!i.copy:u="cta_copy",g.copy_code=i.copy;break;case !!i.tel:u="cta_call",g.phone_number=i.tel;break;case !!i.email:u="cta_email",g.email=i.email;break;case !!(i.reminderOn||i.reminderDate):u="cta_reminder";let{reminderOn:d,reminderDate:m}=i;g.reminder_name=i.reminderName,g.reminder_timestamp=m?Math.floor(+new Date(m)/1e3):Math.floor(Date.now()/1e3)+U(d??"0s");break;default:u="";break}return {name:u,buttonParamsJson:JSON.stringify(g)}}).filter(i=>i.name),c=generateWAMessageFromContent(s,{viewOnceMessage:{message:{interactiveMessage:WAProto.Message.InteractiveMessage.create({...n&&{body:WAProto.Message.InteractiveMessage.Body.create({text:n})},...t&&{footer:WAProto.Message.InteractiveMessage.Footer.create({text:t})},...!!a?.length&&{nativeFlowMessage:WAProto.Message.InteractiveMessage.NativeFlowMessage.create({buttons:a})}})}}},{userJid:s});return this.debug&&this.logger?.debug("WHATSAPP","send buttons message",{jid:s,footer:t,body:n,buttons:a}),this.socket?.relayMessage(s,c.message,{messageId:c.key.id})}async sendReplyButtonsMessage(e,{title:t,subtitle:n,buttons:r}){if(!t||!r.length)throw new Error("sendReplyButtonsMessage: No title or buttons required field found.");await this.ensureSocketConnected();let s=o.formatPhoneNumberToWhatsappPattern(e),a=r.filter(c=>c).map((c,i)=>typeof c=="string"?{buttonId:`id-${i}`,buttonText:{displayText:c},type:1}:{buttonId:`${c.id}`,buttonText:{displayText:c.label},type:1});return this.debug&&this.logger?.debug("WHATSAPP","send reply buttons message",{jid:s,text:t,footer:n,buttons:a}),this.socket?.sendMessage(s,{text:t,...n&&{footer:n},buttons:a})}};var A=class o extends B{constructor(e){super(e);}async sendFileFromStream(e,t,n){await this.ensureSocketConnected();let r=o.formatPhoneNumberToWhatsappPattern(e),s=t instanceof Buffer?t:await this.streamToBuffer(t),a=n.mimetype||this.getMimetypeFromFilename(n.filename),c=await this.createFileMessage(s,a,n),i={...n.replyToMessageId&&{quoted:{key:{id:n.replyToMessageId}}}};return this.socket?.sendMessage(r,c,i)}async streamToBuffer(e){return new Promise((t,n)=>{let r=[];e.on("data",s=>r.push(Buffer.from(s))),e.on("error",s=>n(s)),e.on("end",()=>t(Buffer.concat(r)));})}getMimetypeFromFilename(e){let t=e.split(".").pop()?.toLowerCase();return H[t||""]||"application/octet-stream"}async createFileMessage(e,t,n){let[r]=t.split("/");switch(r){case "image":return {image:e,caption:n.caption,mimetype:t,fileName:n.filename};case "video":return {video:e,caption:n.caption,mimetype:t,fileName:n.filename,gifPlayback:n.gifPlayback||false,jpegThumbnail:n.jpegThumbnail,...n.seconds&&{seconds:n.seconds}};case "audio":return n.ptt?{audio:e,mimetype:"audio/ogg; codecs=opus",ptt:true,...n.seconds&&{seconds:n.seconds}}:{audio:e,mimetype:t,fileName:n.filename,...n.seconds&&{seconds:n.seconds}};default:return {document:e,mimetype:t,fileName:n.filename,caption:n.caption,jpegThumbnail:n.jpegThumbnail}}}async sendImage(e,t,n={}){return this.sendFileFromStream(e,t,{filename:n.filename||"image.jpg",caption:n.caption,replyToMessageId:n.replyToMessageId})}async sendVideo(e,t,n={}){return this.sendFileFromStream(e,t,{filename:n.filename||"video.mp4",caption:n.caption,gifPlayback:n.gifPlayback,replyToMessageId:n.replyToMessageId,jpegThumbnail:n.jpegThumbnail})}async sendAudio(e,t,n={}){return this.sendFileFromStream(e,t,{filename:n.filename||"audio.mp3",mimetype:n.ptt?"audio/ogg; codecs=opus":"",ptt:n.ptt,seconds:n.seconds,replyToMessageId:n.replyToMessageId})}async sendDocument(e,t,n){return this.sendFileFromStream(e,t,{filename:n.filename,mimetype:n.mimetype,caption:n.caption,replyToMessageId:n.replyToMessageId,jpegThumbnail:n.jpegThumbnail})}async sendVoiceNote(e,t,n={}){return this.sendAudio(e,t,{ptt:true,seconds:n.seconds,replyToMessageId:n.replyToMessageId})}async sendSticker(e,t,n={}){await this.ensureSocketConnected();let r=o.formatPhoneNumberToWhatsappPattern(e),s=t instanceof Buffer?t:await this.streamToBuffer(t),a={...n.replyToMessageId&&{quoted:{key:{id:n.replyToMessageId}}}};return this.socket?.sendMessage(r,{sticker:s},a)}};var v=class o extends A{static DEFAULT_COUNTRY_CODE="972";constructor(e){super(e);}async sendImageMessage(e,t,{caption:n="",filename:r}={}){await this.ensureSocketConnected();let s=o.formatPhoneNumberToWhatsappPattern(e),a=typeof t=="string"?await f(t):t;return this.debug&&this.logger?.debug("WHATSAPP","send image message",{jid:s,caption:n,filename:r}),await this.sendImage(s,a,{caption:n,...r&&{filename:r}})}async sendVideoMessage(e,t,{caption:n="",filename:r,sendAsGifPlayback:s=false}={}){await this.ensureSocketConnected();let a=o.formatPhoneNumberToWhatsappPattern(e),c=typeof t=="string"?await f(t):t;return this.debug&&this.logger?.debug("WHATSAPP","send video message",{jid:a,caption:n,filename:r,gifPlayback:s}),await this.sendVideo(a,c,{caption:n,gifPlayback:s,...r&&{filename:r}})}async sendFileMessage(e,t,{caption:n="",mimetype:r="application/vnd.openxmlformats-officedocument.wordprocessingml.document",replyToMessageId:s,jpegThumbnailSrc:a,filename:c}={}){await this.ensureSocketConnected();let i=o.formatPhoneNumberToWhatsappPattern(e),g=typeof t=="string"?await f(t):t,u;typeof a=="string"?u=await f(a):a instanceof ReadStream?u=await L(a):u=a;let d="mu-document";if(t instanceof ReadStream){let m=j(t);m&&(d=m);}else typeof t=="string"&&(d=basename(t));return this.debug&&this.logger?.debug("WHATSAPP","send file message",{jid:i,caption:n,mimetype:r,filename:d,replyToMessageId:s,includeJpegThumbnail:!!u}),await this.sendDocument(i,g,{caption:n,mimetype:r,filename:d,replyToMessageId:s,jpegThumbnail:u})}async sendAudioMessage(e,t,{filename:n,replyToMessageId:r,mimetype:s,seconds:a}={}){await this.ensureSocketConnected();let c=o.formatPhoneNumberToWhatsappPattern(e),i=typeof t=="string"?await f(t):t,g=a||await E(i,s).catch(()=>0);return this.debug&&this.logger?.debug("WHATSAPP","send audio message",{jid:c,mimetype:s,filename:n,seconds:g,replyToMessageId:r}),await this.sendAudio(c,i,{...n&&{filename:n},...s&&{mimetype:s},...g&&{seconds:g},...r&&{replyToMessageId:r}})}async sendStickerMessage(e,t,{replyToMessageId:n}={}){await this.ensureSocketConnected();let r=o.formatPhoneNumberToWhatsappPattern(e),s=typeof t=="string"?await f(t):t;this.debug&&this.logger?.debug("WHATSAPP","send sticker message",{jid:r,replyToMessageId:n}),await this.sendSticker(r,s,{replyToMessageId:n});}};var Q=class extends v{constructor(e){super(e);}};
2
+ export{Q as WhatsappSocket};//# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/mongoAuthState.ts","../src/helpers.ts","../src/whatsappSocket.base.ts","../src/whatsappSocket.messages.ts","../src/whatsappSocket.stream.ts","../src/whatsappSocket.files.ts","../src/whatsappSocket.client.ts"],"names":["BufferJSON","_k","value","_","val","useMongoDBAuthState","collection","writeData","data","id","update","readData","removeData","creds","initAuthCreds","type","ids","proto","tasks","category","key","mongoAuthState_default","getTotalSeconds","msValue","ms","getUrlBuffer","url","arrayBuffer","getDurationFromStream","stream","mimeType","metadata","parseStream","error","getDurationFromBuffer","buffer","parseBuffer","getAudioFileDuration","audioFile","ReadStream","streamToBuffer","chunks","chunk","getFilenameFromStream","pathStr","basename","sleep","timeout","resolve","pinoLogger","P","WhatsappSocketBase","_WhatsappSocketBase","phone","countryCode","strNumber","message","formattedPhone","query","qr","options","QRCode","pattern","length","result","pool","buildPool","block","chars","i","start","end","c","char","upperCaseResult","fileAuthStateDirectoryPath","mongoURL","mongoCollection","logger","onOpen","onClose","onQR","onReceiveMessages","onConnectionStatusChange","debug","printQRInTerminal","pairingPhone","customPairingCode","allowUseLastVersion","mongoClient","MongoClient","saveCreds","state","useMultiFileAuthState","makeCacheableSignalKeyStore","connectionAttempts","_pairingPhone","_debug","auth","version","isLatest","fetchLatestBaileysVersion","connect","sock","makeWASocket","jid","connection","lastDisconnect","qrcode","pairing","code","shouldReconnect","DisconnectReason","statusCode","errorMessage","messages","fs","WhatsappSocketMessages","_WhatsappSocketMessages","props","to","text","replyToMessageId","subtitle","title","buttons","buttonsValue","btn","buttonParamsJson","name","reminderOn","reminderDate","v","msg","generateWAMessageFromContent","displayText","index","WhatsappSocketStream","_WhatsappSocketStream","mimetype","messageContent","messageOptions","reject","err","filename","ext","imageBuffer","videoBuffer","audioBuffer","documentBuffer","stickerBuffer","WhatsappSocketFiles","_WhatsappSocketFiles","imageSrc","caption","imageData","videoSrc","gifPlayback","fileSrc","jpegThumbnailSrc","_filename","fileBuffer","jpegThumbnailBuffer","fname","audioSrc","seconds","durationInSeconds","WhatsappSocket"],"mappings":"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","file":"index.js","sourcesContent":["import {\n type AuthenticationCreds,\n type SignalDataTypeMap,\n initAuthCreds,\n WAProto as proto,\n} from '@fadzzzslebew/baileys';\n\nconst BufferJSON = {\n replacer: (_k: string, value: any) => {\n if (Buffer.isBuffer(value) || value instanceof Uint8Array || value?.type === 'Buffer') {\n return {\n type: 'Buffer',\n data: Buffer.from(value?.data || value).toString('base64'),\n };\n }\n return value;\n },\n\n reviver: (_: string, value: any) => {\n if (typeof value === 'object' && !!value && (value.buffer === true || value.type === 'Buffer')) {\n const val = value.data || value.value;\n return typeof val === 'string' ? Buffer.from(val, 'base64') : Buffer.from(val || []);\n }\n return value;\n },\n};\n\nconst useMongoDBAuthState = async (collection: any) => {\n const writeData = (data: any, id: string) => {\n const informationToStore = JSON.parse(JSON.stringify(data, BufferJSON.replacer));\n const update = { $set: { ...informationToStore } };\n return collection.updateOne({ _id: id }, update, { upsert: true });\n };\n\n const readData = async (id: string) => {\n try {\n const data = JSON.stringify(await collection.findOne({ _id: id }));\n return JSON.parse(data, BufferJSON.reviver);\n } catch (error) {\n return null;\n }\n };\n\n const removeData = async (id: string) => {\n try {\n await collection.deleteOne({ _id: id });\n } catch (_a) {}\n };\n\n const creds: AuthenticationCreds = (await readData('creds')) || initAuthCreds();\n\n return {\n state: {\n creds,\n keys: {\n get: async (type: keyof SignalDataTypeMap, ids: string[]) => {\n const data: { [id: string]: any } = {};\n await Promise.all(\n ids.map(async (id) => {\n let value = await readData(`${type}-${id}`);\n if (type === 'app-state-sync-key' && value) {\n value = proto.Message.AppStateSyncKeyData.fromObject(value);\n }\n data[id] = value;\n })\n );\n return data;\n },\n set: async (data: any) => {\n const tasks: Promise<any>[] = [];\n for (const category of Object.keys(data)) {\n for (const id of Object.keys(data[category])) {\n const value = data[category][id];\n const key = `${category}-${id}`;\n tasks.push(value ? writeData(value, key) : removeData(key));\n }\n }\n await Promise.all(tasks);\n },\n },\n },\n saveCreds: () => {\n return writeData(creds, 'creds');\n },\n };\n};\n\nexport default useMongoDBAuthState;\n","import ms, { type StringValue } from 'ms';\nimport { parseBuffer, parseStream } from 'music-metadata';\nimport { ReadStream } from 'node:fs';\nimport { basename } from 'node:path';\n\nexport const getTotalSeconds = (msValue: StringValue) => {\n const value = ms(msValue);\n return value / 1000;\n};\n\nexport async function getUrlBuffer(url: string) {\n const response = await fetch(url);\n const arrayBuffer = await response.arrayBuffer();\n const buffer = Buffer.from(arrayBuffer);\n return buffer;\n}\n\nasync function getDurationFromStream(stream: ReadStream, mimeType?: string): Promise<number> {\n try {\n const metadata = await parseStream(stream, { mimeType: mimeType || 'audio/mpeg' });\n return Math.floor(metadata.format.duration || 0);\n } catch (error) {\n console.error('Error parsing stream:', error);\n throw error;\n } finally {\n if (!stream.destroyed) {\n stream.destroy();\n }\n }\n}\nasync function getDurationFromBuffer(buffer: Buffer, mimeType?: string): Promise<number> {\n try {\n const metadata = await parseBuffer(buffer, mimeType || 'audio/mpeg').catch(() => null);\n return metadata ? Math.floor(metadata.format.duration || 0) : 0;\n } catch (error) {\n console.error('Error parsing buffer:', error);\n throw error;\n }\n}\n\nexport async function getAudioFileDuration(audioFile: ReadStream | Buffer, mimeType?: string): Promise<number> {\n if (audioFile instanceof ReadStream) {\n return getDurationFromStream(audioFile, mimeType);\n } else {\n return getDurationFromBuffer(audioFile, mimeType);\n }\n}\n\nexport async function streamToBuffer(stream: ReadStream): Promise<Buffer> {\n const chunks: Buffer[] = [];\n\n for await (const chunk of stream) {\n chunks.push(chunk);\n }\n\n return Buffer.concat(chunks);\n}\n\nexport function getFilenameFromStream(stream: ReadStream): string | undefined {\n if (stream.path) {\n const pathStr = stream.path.toString();\n return basename(pathStr);\n }\n return undefined;\n}\n\nexport const sleep = (timeout: StringValue | number) => {\n return new Promise((resolve) => setTimeout(resolve, typeof timeout === 'number' ? timeout : ms(timeout)));\n};\n","// Baileys links\n// https://whiskeysockets.github.io/docs/tutorial-basics/sending-messages\n// https://github.com/WhiskeySockets/Baileys\n// https://github.com/ndalu-id/baileys-api\n// https://whiskeysockets.github.io/Baileys/\n// alternatives:\n// https://www.npmjs.com/package/mudslide\n// https://www.npmjs.com/package/whatsapp-web.js\n// https://www.npmjs.com/package/wbm\nimport {\n default as makeWASocket,\n DisconnectReason,\n fetchLatestBaileysVersion,\n makeCacheableSignalKeyStore,\n type MessageUpsertType,\n type UserFacingSocketConfig,\n type WAMessage,\n type WASocket,\n useMultiFileAuthState,\n type AuthenticationState,\n} from '@fadzzzslebew/baileys';\nimport { type StringValue } from 'ms';\nimport type { Logger as MyLogger } from 'stack-trace-logger';\nimport fs from 'node:fs';\nimport QRCode from 'qrcode';\nimport { type Collection, type Document as MongoDocument, MongoClient } from 'mongodb';\nimport P from 'pino';\nimport type { Boom } from '@hapi/boom';\nimport useMongoDBAuthState from './mongoAuthState.ts';\nimport { sleep } from './helpers.ts';\n\nconst pinoLogger: any = P({ level: 'silent' });\n\nexport type WhatsappSocketBaseProps = (\n | { mongoURL: string; fileAuthStateDirectoryPath?: string }\n | { mongoURL?: string; fileAuthStateDirectoryPath: string }\n) & {\n logger?: any;\n mongoCollection?: string;\n onOpen?: () => Promise<void> | void;\n onClose?: () => Promise<void> | void;\n onConnectionStatusChange?: (connectionStatus: 'connecting' | 'close' | 'open') => Promise<void> | void;\n onReceiveMessages?: (messages: WAMessage[], type: MessageUpsertType) => Promise<void> | void;\n onQR?: (qr: string, code?: string | null) => Promise<void> | void;\n debug?: boolean;\n printQRInTerminal?: boolean;\n pairingPhone?: string;\n customPairingCode?: string;\n allowUseLastVersion?: boolean;\n};\n\nexport class WhatsappSocketBase {\n protected socket: null | WASocket;\n protected readonly fileAuthStateDirectoryPath?: string;\n protected readonly mongoURL?: string;\n protected readonly mongoCollection: string = 'whatsapp-auth';\n protected readonly logger?: MyLogger;\n protected readonly debug?: boolean;\n protected readonly printQRInTerminal?: boolean;\n protected readonly pairingPhone?: string;\n protected readonly customPairingCode?: string;\n protected readonly allowUseLastVersion?: boolean;\n private onOpen?: () => Promise<void> | void;\n private onClose?: () => Promise<void> | void;\n private onQR?: (qr: string, code?: string | null) => Promise<void> | void;\n private onConnectionStatusChange?: (connectionStatus: 'open' | 'close' | 'connecting') => Promise<void> | void;\n private readonly onReceiveMessages?: (messages: WAMessage[], type: MessageUpsertType) => Promise<void> | void;\n static DEFAULT_COUNTRY_CODE: string = '972';\n static CONNECTION_TIMEOUT: StringValue = '2s';\n\n static formatPhoneNumber(phone: string, countryCode: string = WhatsappSocketBase.DEFAULT_COUNTRY_CODE): string {\n if (phone.endsWith('@s.whatsapp.net')) return phone;\n\n let strNumber = phone.replace(/[^0-9]/g, '');\n if (strNumber.startsWith('05')) strNumber = strNumber.substring(1);\n if (!strNumber.startsWith(countryCode)) strNumber = countryCode + strNumber;\n\n return strNumber; // formatted Number should look like: '+972 051-333-4444' to: '972513334444'\n }\n\n static formatPhoneNumberToWhatsappPattern(\n phone: string,\n countryCode: string = WhatsappSocketBase.DEFAULT_COUNTRY_CODE\n ): string {\n if (phone.endsWith('@s.whatsapp.net')) return phone;\n\n let strNumber = WhatsappSocketBase.formatPhoneNumber(phone, countryCode);\n strNumber = `${strNumber}@s.whatsapp.net`; // formatted Number should look like: '972513334444@s.whatsapp.net'\n return strNumber;\n }\n\n static getWhatsappPhoneLink({\n phone,\n message,\n countryCode = this.DEFAULT_COUNTRY_CODE,\n }: {\n phone: string;\n countryCode?: string;\n message?: string;\n }) {\n const formattedPhone = this.formatPhoneNumber(phone, countryCode);\n const query = { ...(message && { text: encodeURI(message) }) };\n return `https://wa.me/${formattedPhone}?${query}`;\n }\n\n static async qrToImage(\n qr: string,\n options: {\n errorCorrectionLevel?: 'H' | 'L' | 'M';\n width?: number;\n margin?: number;\n [key: string]: any;\n } = {}\n ) {\n return QRCode.toDataURL(qr, {\n errorCorrectionLevel: 'H', // Changed to 'H' (High) for better reliability\n width: 400, // Increased size for better scanning\n margin: 2, // Ensure adequate margin\n ...options,\n });\n }\n\n static async qrToTerminalString(\n qr: string,\n options: {\n small?: boolean;\n [key: string]: any;\n } = {}\n ) {\n return QRCode.toString(qr, { type: 'terminal', small: true, ...options });\n }\n\n // only 8 alphanumeric (no more or less), patterns [a-z0-8] | aaaa[0-8] xxzzvvcc [zaq0-8]\n static randomPairingCode(pattern: string, length = 8) {\n // no randomness needed\n if (!pattern.includes('[') && pattern.length === length) {\n return pattern;\n }\n\n let result = '';\n let pool: string[] = [];\n\n const buildPool = (block: string) => {\n const chars: string[] = [];\n\n for (let i = 0; i < block.length; i++) {\n if (block[i + 1] === '-' && block[i + 2]) {\n const start = block.charCodeAt(i);\n const end = block.charCodeAt(i + 2);\n\n for (let c = start; c <= end; c++) {\n chars.push(String.fromCharCode(c));\n }\n\n i += 2;\n } else {\n chars.push(block[i]);\n }\n }\n\n return chars;\n };\n\n for (let i = 0; i < pattern.length && result.length < length; i++) {\n const char = pattern[i];\n\n if (char === '[') {\n const end = pattern.indexOf(']', i);\n const block = pattern.slice(i + 1, end);\n\n pool = buildPool(block);\n i = end;\n } else {\n result += char;\n }\n }\n\n // fill remaining from pool\n while (result.length < length && pool.length) {\n result += pool[Math.floor(Math.random() * pool.length)];\n }\n\n const upperCaseResult = result.toUpperCase();\n return upperCaseResult.padEnd(length, upperCaseResult);\n }\n\n constructor({\n fileAuthStateDirectoryPath,\n mongoURL,\n mongoCollection = 'whatsapp-auth',\n logger,\n onOpen,\n onClose,\n onQR,\n onReceiveMessages,\n onConnectionStatusChange,\n debug,\n printQRInTerminal,\n pairingPhone,\n customPairingCode,\n allowUseLastVersion = true,\n }: WhatsappSocketBaseProps) {\n this.mongoURL = mongoURL;\n this.fileAuthStateDirectoryPath = fileAuthStateDirectoryPath;\n this.mongoCollection = mongoCollection;\n this.logger = logger;\n this.debug = debug;\n this.printQRInTerminal = printQRInTerminal;\n this.pairingPhone = pairingPhone;\n this.customPairingCode = customPairingCode;\n this.allowUseLastVersion = allowUseLastVersion;\n this.onConnectionStatusChange = onConnectionStatusChange;\n this.socket = null;\n this.onReceiveMessages = onReceiveMessages;\n this.onOpen = onOpen;\n this.onClose = onClose;\n this.onQR = onQR;\n }\n\n private async getAuthCollection(): Promise<[] | [Collection<MongoDocument>, MongoClient]> {\n if (!this.mongoURL) return [];\n\n const mongoClient = new MongoClient(this.mongoURL);\n await mongoClient.connect();\n const collection = mongoClient.db().collection(this.mongoCollection);\n\n return [collection, mongoClient];\n }\n\n private async authenticate(): Promise<{ auth: AuthenticationState; saveCreds: any }> {\n if (!this.mongoURL && !this.fileAuthStateDirectoryPath) {\n throw new Error('fileAuthStateDirectoryPath/MongoURL is missing');\n }\n if (!this.mongoURL) {\n const { saveCreds, state } = await useMultiFileAuthState(this.fileAuthStateDirectoryPath as string);\n return { auth: state, saveCreds };\n }\n\n const [collection] = await this.getAuthCollection();\n\n const { state, saveCreds } = await useMongoDBAuthState(collection);\n const auth = {\n creds: state.creds,\n keys: makeCacheableSignalKeyStore(state.keys, pinoLogger as any),\n } as AuthenticationState;\n\n return { auth, saveCreds };\n }\n\n async startConnection({\n options,\n connectionAttempts = 3,\n onOpen = this.onOpen,\n onClose = this.onClose,\n onQR = this.onQR,\n onConnectionStatusChange = this.onConnectionStatusChange,\n pairingPhone: _pairingPhone,\n debug: _debug,\n }: {\n options?: UserFacingSocketConfig;\n debug?: boolean;\n pairingPhone?: string;\n connectionAttempts?: number;\n onOpen?: () => Promise<void> | void;\n onClose?: () => Promise<void> | void;\n onQR?: (qr: string, code?: string | null) => Promise<void> | void;\n onConnectionStatusChange?: (status: 'open' | 'close' | 'connecting') => Promise<void> | void;\n } = {}): Promise<WASocket | null> {\n const pairingPhone = _pairingPhone ?? this.pairingPhone;\n const { saveCreds, auth } = await this.authenticate();\n const debug = _debug === undefined ? this.debug : _debug;\n\n // Fetch latest Baileys version for better compatibility\n const { version, isLatest } = await fetchLatestBaileysVersion();\n if (this.allowUseLastVersion && !isLatest) {\n if (debug)\n this.logger?.warn('WHATSAPP', 'current baileys service is not the latest version!', {\n version,\n isLatest,\n });\n }\n\n const connect = async (): Promise<WASocket | null> => {\n return new Promise((resolve) => {\n const sock = makeWASocket({\n version: this.allowUseLastVersion ? version : [2, 3000, 1027934701],\n logger: pinoLogger,\n browser: ['Ubuntu', 'Chrome', '20.0.04'],\n syncFullHistory: false, // Don't sync full history on first connect\n shouldSyncHistoryMessage: () => false,\n shouldIgnoreJid: (jid) => jid.includes('@newsletter'), // Ignore newsletter\n ...options,\n printQRInTerminal: false,\n ...{ auth },\n });\n\n // CRITICAL: Handle connection updates properly\n sock.ev.on('connection.update', async (update) => {\n const { connection, lastDisconnect, qr } = update;\n\n if (qr) {\n if (debug) this.logger?.info('WHATSAPP', 'QR Code received', { qr });\n if (this.printQRInTerminal) {\n const qrcode = await WhatsappSocketBase.qrToTerminalString(qr, { small: true }).catch(\n () => null\n );\n console.log(qrcode);\n }\n\n // @ts-ignore\n const pair = this.customPairingCode\n ? WhatsappSocketBase.randomPairingCode(this.customPairingCode)\n : undefined;\n\n const pairing = pairingPhone ? WhatsappSocketBase.formatPhoneNumber(pairingPhone) : null;\n const code = pairing ? await sock.requestPairingCode(pairing) : null;\n\n if (debug && this.printQRInTerminal) {\n this.logger?.info('WHATSAPP', 'QR Pairing Code', { code, pairingPhone: pairing });\n }\n\n await onQR?.(qr, code);\n }\n\n switch (connection) {\n case 'connecting': {\n if (debug) this.logger?.debug('WHATSAPP', 'Connecting...');\n onConnectionStatusChange?.('connecting');\n break;\n }\n\n case 'open': {\n if (debug) this.logger?.info('WHATSAPP', 'Connection opened successfully!');\n this.socket = sock;\n await onOpen?.();\n onConnectionStatusChange?.('open');\n resolve(this.socket);\n break;\n }\n\n case 'close': {\n const shouldReconnect =\n connectionAttempts-- > 0 &&\n (lastDisconnect?.error as Boom)?.output?.statusCode !== DisconnectReason.loggedOut;\n\n const statusCode = (lastDisconnect?.error as Boom)?.output?.statusCode;\n const errorMessage = lastDisconnect?.error?.message;\n\n if (debug) {\n this.logger?.info('WHATSAPP', 'Connection closed', {\n statusCode,\n errorMessage,\n shouldReconnect,\n });\n }\n\n // IMPORTANT: Error code 515 (Stream Errored) after QR scan is NORMAL\n // The connection must restart after pairing - this is expected behavior\n if (shouldReconnect && connectionAttempts) {\n if (debug) this.logger?.info('WHATSAPP', 'Reconnecting...');\n await sleep(WhatsappSocketBase.CONNECTION_TIMEOUT);\n resolve(connect());\n } else {\n if (debug) this.logger?.warn('WHATSAPP', 'Logged out, clearing auth state');\n await onClose?.();\n this.socket = null;\n resolve(this.socket);\n }\n\n onConnectionStatusChange?.('close');\n break;\n }\n }\n });\n\n // Save credentials when they update\n sock.ev.on('creds.update', saveCreds);\n\n // Handle messages\n if (this.onReceiveMessages && typeof this.onReceiveMessages === 'function') {\n sock.ev.on('messages.upsert', async ({ messages, type }) => {\n this.logger?.info('WHATSAPP', 'Received messages', { type, totalMessages: messages.length });\n this.onReceiveMessages?.(messages, type);\n\n // const msg = messages[0]\n // if (!msg.key.fromMe && msg.message?.conversation) {\n // const sender = msg.key.remoteJid\n // const text = msg.message.conversation.toLowerCase()\n //\n // console.log(`📩 Message from ${sender}: ${text}`)\n //\n // if (text === 'hi') {\n // await sock.sendMessage(sender, { text: 'Hello! How can I help you today?' })\n // }\n // }\n });\n }\n });\n };\n\n const socket = await connect();\n\n return socket;\n }\n\n async closeConnection() {\n if (this.socket) {\n if (this.debug) this.logger?.info('WHATSAPP', 'Closing connection');\n this.socket.end(undefined);\n this.socket = null;\n }\n }\n\n async clearAuthState() {\n if (this.mongoURL) {\n const [collection, mongoClient] = await this.getAuthCollection();\n\n if (this.debug) this.logger?.info('WHATSAPP', 'Deleting auth state, required to scanning QR again');\n await collection?.deleteMany({});\n await mongoClient?.close();\n } else if (this.fileAuthStateDirectoryPath) {\n fs.rmSync(this.fileAuthStateDirectoryPath, { recursive: true, force: true });\n }\n }\n\n async resetConnection({ pairingPhone }: { pairingPhone?: string } = {}) {\n await this.closeConnection();\n await this.clearAuthState();\n // Wait a bit before reconnecting\n await new Promise((resolve) => setTimeout(resolve, 2000));\n await this.startConnection({ pairingPhone });\n }\n\n isConnected() {\n return this.socket !== null && this.socket.user !== undefined;\n }\n}\n","import { type MiscMessageGenerationOptions, generateWAMessageFromContent } from '@fadzzzslebew/baileys';\nimport { WAProto as proto } from '@fadzzzslebew/baileys';\nimport { WhatsappSocketBase, type WhatsappSocketBaseProps } from './whatsappSocket.base.ts';\nexport type { WhatsappSocketBaseProps as WhatsappSocketMessagesProps } from './whatsappSocket.base.ts';\nimport { type StringValue } from 'ms';\nimport { getTotalSeconds } from './helpers.ts';\n\ntype ButtonURL = { label: string; url: string };\ntype ButtonCopy = { label: string; copy: string };\ntype ButtonPhone = { label: string; tel: string };\ntype ButtonEmail = { label: string; email: string };\ntype ButtonReminder = { label: string; reminderName: string } & (\n | { reminderOn?: StringValue; reminderDate: number }\n | { reminderOn: StringValue; reminderDate?: number | Date | string }\n);\n\ntype ButtonParamsJson = {\n display_text: string;\n url?: string;\n copy_code?: string;\n phone_number?: string;\n email?: string;\n reminder_name?: string;\n reminder_timestamp?: number;\n};\n\ntype CallToActionButtons = Array<\n ButtonURL | ButtonCopy | ButtonPhone\n // ButtonEmail | ButtonReminder // not supported\n>;\n\ntype CallToActionFullButtons = Array<ButtonURL | ButtonCopy | ButtonPhone | ButtonEmail | ButtonReminder>;\n\nexport class WhatsappSocketMessages extends WhatsappSocketBase {\n static DEFAULT_COUNTRY_CODE: string = '972';\n\n constructor(props: WhatsappSocketBaseProps) {\n super(props);\n }\n\n async sendTextMessage(to: string, text: string, replyToMessageId?: string): Promise<any> {\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketMessages.formatPhoneNumberToWhatsappPattern(to);\n const options: MiscMessageGenerationOptions = {\n ...(replyToMessageId && { quoted: { key: { id: replyToMessageId } } }),\n };\n\n return this.socket?.sendMessage(jid, { text }, options);\n }\n\n async sendButtonsMessage(\n to: string,\n { subtitle, title, buttons }: { title: string; subtitle?: string; buttons: CallToActionButtons }\n ): Promise<any> {\n if (!title || !buttons.length) {\n throw new Error('sendButtonsMessage: No title or buttons required field found.');\n }\n\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketMessages.formatPhoneNumberToWhatsappPattern(to);\n\n const buttonsValue = (buttons as CallToActionFullButtons)\n ?.map((btn) => {\n const buttonParamsJson: ButtonParamsJson = { display_text: btn.label };\n\n let name: string;\n switch (true) {\n case !!(btn as ButtonURL).url:\n name = 'cta_url';\n buttonParamsJson.url = (btn as ButtonURL).url;\n break;\n case !!(btn as ButtonCopy).copy:\n name = 'cta_copy';\n buttonParamsJson.copy_code = (btn as ButtonCopy).copy;\n break;\n case !!(btn as ButtonPhone).tel:\n name = 'cta_call';\n buttonParamsJson.phone_number = (btn as ButtonPhone).tel;\n break;\n case !!(btn as ButtonEmail).email:\n name = 'cta_email';\n buttonParamsJson.email = (btn as ButtonEmail).email;\n break;\n case !!((btn as ButtonReminder).reminderOn || (btn as ButtonReminder).reminderDate):\n name = 'cta_reminder';\n const { reminderOn, reminderDate } = btn as ButtonReminder;\n buttonParamsJson.reminder_name = (btn as ButtonReminder).reminderName;\n buttonParamsJson.reminder_timestamp = reminderDate\n ? Math.floor(+new Date(reminderDate) / 1000)\n : Math.floor(Date.now() / 1000) + getTotalSeconds(reminderOn ?? '0s');\n break;\n default:\n name = '';\n break;\n }\n\n return { name, buttonParamsJson: JSON.stringify(buttonParamsJson) };\n })\n .filter((v) => v.name);\n\n const msg = generateWAMessageFromContent(\n jid,\n {\n viewOnceMessage: {\n message: {\n interactiveMessage: proto.Message.InteractiveMessage.create({\n ...(title && {\n body: proto.Message.InteractiveMessage.Body.create({ text: title }),\n }),\n ...(subtitle && {\n footer: proto.Message.InteractiveMessage.Footer.create({ text: subtitle }),\n }),\n ...(!!buttonsValue?.length && {\n nativeFlowMessage: proto.Message.InteractiveMessage.NativeFlowMessage.create({\n buttons: buttonsValue,\n }),\n }),\n }),\n },\n },\n },\n { userJid: jid }\n );\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'send buttons message', {\n jid,\n footer: subtitle,\n body: title,\n buttons: buttonsValue,\n });\n }\n\n return this.socket?.relayMessage(jid, msg.message!, { messageId: msg.key.id! });\n }\n\n async sendReplyButtonsMessage(\n to: string,\n {\n title,\n subtitle,\n buttons,\n }: {\n title: string;\n subtitle?: string;\n buttons: string[];\n }\n ): Promise<any> {\n if (!title || !buttons.length) {\n throw new Error('sendReplyButtonsMessage: No title or buttons required field found.');\n }\n\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketMessages.formatPhoneNumberToWhatsappPattern(to);\n\n const buttonsValue = buttons\n .filter((v) => v)\n .map((displayText, index) => ({ buttonId: `id${index}`, buttonText: { displayText }, type: 1 }));\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'send reply buttons message', {\n jid,\n text: title,\n footer: subtitle,\n buttons: buttonsValue,\n });\n }\n\n return this.socket?.sendMessage(jid, {\n text: title,\n ...(subtitle && { footer: subtitle }),\n buttons: buttonsValue /* type: UNKNOWN = 0, RESPONSE = 1, NATIVE_FLOW = 2 */,\n });\n }\n}\n","import { type AnyMessageContent } from '@fadzzzslebew/baileys';\nimport { Readable } from 'stream';\nimport { WhatsappSocketMessages, type WhatsappSocketMessagesProps } from './whatsappSocket.messages.ts';\nexport { type WhatsappSocketMessagesProps as WhatsappSocketStreamProps } from './whatsappSocket.messages';\n\nexport class WhatsappSocketStream extends WhatsappSocketMessages {\n static DEFAULT_COUNTRY_CODE: string = '972';\n\n constructor(props: WhatsappSocketMessagesProps) {\n super(props);\n }\n\n protected async sendFileFromStream(\n to: string,\n stream: Readable | Buffer,\n options: {\n filename: string;\n mimetype?: string;\n caption?: string;\n replyToMessageId?: string;\n // File type specific options\n ptt?: boolean; // Push to talk (voice note)\n seconds?: number; // Duration for audio/video\n gifPlayback?: boolean; // For GIF videos\n // Additional options\n jpegThumbnail?: Buffer | string; // Thumbnail for videos/documents\n }\n ): Promise<any> {\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketStream.formatPhoneNumberToWhatsappPattern(to);\n\n // Convert stream to buffer if needed\n const buffer = stream instanceof Buffer ? stream : await this.streamToBuffer(stream as Readable);\n\n // Auto-detect mimetype if not provided\n const mimetype = options.mimetype || this.getMimetypeFromFilename(options.filename);\n\n // Determine message type based on mimetype\n const messageContent = await this.createFileMessage(buffer, mimetype, options);\n\n const messageOptions: any = {\n ...(options.replyToMessageId && {\n quoted: { key: { id: options.replyToMessageId } },\n }),\n };\n\n return this.socket?.sendMessage(jid, messageContent, messageOptions);\n }\n\n private async streamToBuffer(stream: Readable): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n stream.on('data', (chunk) => chunks.push(Buffer.from(chunk)));\n stream.on('error', (err) => reject(err));\n stream.on('end', () => resolve(Buffer.concat(chunks)));\n });\n }\n\n private getMimetypeFromFilename(filename: string): string {\n const ext = filename.split('.').pop()?.toLowerCase();\n\n const mimetypes: { [key: string]: string } = {\n // Images\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n png: 'image/png',\n gif: 'image/gif',\n webp: 'image/webp',\n bmp: 'image/bmp',\n svg: 'image/svg+xml',\n\n // Videos\n mp4: 'video/mp4',\n avi: 'video/x-msvideo',\n mov: 'video/quicktime',\n mkv: 'video/x-matroska',\n webm: 'video/webm',\n\n // Audio\n mp3: 'audio/mpeg',\n wav: 'audio/wav',\n ogg: 'audio/ogg',\n opus: 'audio/opus',\n aac: 'audio/aac',\n m4a: 'audio/mp4',\n\n // Documents\n pdf: 'application/pdf',\n doc: 'application/msword',\n docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n xls: 'application/vnd.ms-excel',\n xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n ppt: 'application/vnd.ms-powerpoint',\n pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n txt: 'text/plain',\n zip: 'application/zip',\n rar: 'application/x-rar-compressed',\n '7z': 'application/x-7z-compressed',\n };\n\n return mimetypes[ext || ''] || 'application/octet-stream';\n }\n\n private async createFileMessage(\n buffer: Buffer,\n mimetype: string,\n options: {\n filename: string;\n caption?: string;\n ptt?: boolean;\n seconds?: number;\n gifPlayback?: boolean;\n jpegThumbnail?: Buffer | string;\n }\n ): Promise<AnyMessageContent> {\n const [type] = mimetype.split('/');\n\n switch (type) {\n case 'image':\n return {\n image: buffer,\n caption: options.caption,\n mimetype,\n fileName: options.filename,\n };\n\n case 'video':\n return {\n video: buffer,\n caption: options.caption,\n mimetype,\n fileName: options.filename,\n gifPlayback: options.gifPlayback || false,\n jpegThumbnail: options.jpegThumbnail as string,\n ...(options.seconds && { seconds: options.seconds }),\n };\n\n case 'audio':\n if (options.ptt) {\n // Voice note\n return {\n audio: buffer,\n mimetype: 'audio/ogg; codecs=opus',\n ptt: true,\n ...(options.seconds && { seconds: options.seconds }),\n };\n }\n return {\n audio: buffer,\n mimetype,\n fileName: options.filename,\n ...(options.seconds && { seconds: options.seconds }),\n };\n\n default:\n // Document (PDF, DOC, etc.)\n return {\n document: buffer,\n mimetype,\n fileName: options.filename,\n caption: options.caption,\n jpegThumbnail: options.jpegThumbnail as string,\n };\n }\n }\n\n // Helper method to send specific file types\n protected async sendImage(\n to: string,\n imageBuffer: Buffer | Readable,\n options: {\n caption?: string;\n filename?: string;\n replyToMessageId?: string;\n } = {}\n ): Promise<any> {\n return this.sendFileFromStream(to, imageBuffer, {\n filename: options.filename || 'image.jpg',\n caption: options.caption,\n replyToMessageId: options.replyToMessageId,\n });\n }\n\n protected async sendVideo(\n to: string,\n videoBuffer: Buffer | Readable,\n options: {\n caption?: string;\n filename?: string;\n gifPlayback?: boolean;\n replyToMessageId?: string;\n jpegThumbnail?: Buffer;\n } = {}\n ): Promise<any> {\n return this.sendFileFromStream(to, videoBuffer, {\n filename: options.filename || 'video.mp4',\n caption: options.caption,\n gifPlayback: options.gifPlayback,\n replyToMessageId: options.replyToMessageId,\n jpegThumbnail: options.jpegThumbnail,\n });\n }\n\n protected async sendAudio(\n to: string,\n audioBuffer: Buffer | Readable,\n options: {\n filename?: string;\n ptt?: boolean; // Voice note\n seconds?: number;\n replyToMessageId?: string;\n } = {}\n ): Promise<any> {\n return this.sendFileFromStream(to, audioBuffer, {\n filename: options.filename || 'audio.mp3',\n mimetype: options.ptt ? 'audio/ogg; codecs=opus' : '',\n ptt: options.ptt,\n seconds: options.seconds,\n replyToMessageId: options.replyToMessageId,\n });\n }\n\n protected async sendDocument(\n to: string,\n documentBuffer: Buffer | Readable,\n options: {\n filename: string;\n caption?: string;\n mimetype?: string;\n replyToMessageId?: string;\n jpegThumbnail?: Buffer;\n }\n ): Promise<any> {\n return this.sendFileFromStream(to, documentBuffer, {\n filename: options.filename,\n mimetype: options.mimetype,\n caption: options.caption,\n replyToMessageId: options.replyToMessageId,\n jpegThumbnail: options.jpegThumbnail,\n });\n }\n\n protected async sendVoiceNote(\n to: string,\n audioBuffer: Buffer | Readable,\n options: {\n seconds?: number;\n replyToMessageId?: string;\n } = {}\n ): Promise<any> {\n return this.sendAudio(to, audioBuffer, {\n ptt: true,\n seconds: options.seconds,\n replyToMessageId: options.replyToMessageId,\n });\n }\n\n protected async sendSticker(\n to: string,\n stickerBuffer: Buffer | Readable,\n options: {\n replyToMessageId?: string;\n } = {}\n ): Promise<any> {\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketStream.formatPhoneNumberToWhatsappPattern(to);\n const buffer =\n stickerBuffer instanceof Buffer ? stickerBuffer : await this.streamToBuffer(stickerBuffer as Readable);\n\n const messageOptions: any = {\n ...(options.replyToMessageId && {\n quoted: { key: { id: options.replyToMessageId } },\n }),\n };\n\n return this.socket?.sendMessage(jid, { sticker: buffer }, messageOptions);\n }\n}\n","import { ReadStream } from 'node:fs';\n\nimport { WhatsappSocketStream, type WhatsappSocketStreamProps } from './whatsappSocket.stream';\nexport { type WhatsappSocketStreamProps as WhatsappSocketFilesProps } from './whatsappSocket.stream';\nimport { getAudioFileDuration, getFilenameFromStream, getUrlBuffer, streamToBuffer } from './helpers.ts';\nimport { basename } from 'node:path';\n\nexport class WhatsappSocketFiles extends WhatsappSocketStream {\n static DEFAULT_COUNTRY_CODE: string = '972';\n\n constructor(props: WhatsappSocketStreamProps) {\n super(props);\n }\n\n async sendImageMessage(\n to: string,\n imageSrc: string | Buffer<any> | ReadStream,\n { caption = '', filename }: { caption?: string; filename?: string } = {}\n ) {\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketFiles.formatPhoneNumberToWhatsappPattern(to);\n const imageData = typeof imageSrc === 'string' ? await getUrlBuffer(imageSrc) : imageSrc;\n\n if (this.debug) this.logger?.debug('WHATSAPP', 'send image message', { jid, caption, filename });\n return await super.sendImage(jid, imageData, { caption, ...(filename && { filename }) });\n }\n\n async sendVideoMessage(\n to: string,\n videoSrc: string | Buffer<any> | ReadStream,\n {\n caption = '',\n filename,\n sendAsGifPlayback: gifPlayback = false,\n }: { caption?: string; sendAsGifPlayback?: boolean; filename?: string } = {}\n ) {\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketFiles.formatPhoneNumberToWhatsappPattern(to);\n const videoBuffer = typeof videoSrc === 'string' ? await getUrlBuffer(videoSrc) : videoSrc;\n\n if (this.debug) this.logger?.debug('WHATSAPP', 'send video message', { jid, caption, filename, gifPlayback });\n return await super.sendVideo(jid, videoBuffer, { caption, gifPlayback, ...(filename && { filename }) });\n }\n\n async sendFileMessage(\n to: string,\n fileSrc: string | Buffer<any> | ReadStream,\n {\n caption = '',\n mimetype = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n replyToMessageId,\n jpegThumbnailSrc,\n filename: _filename,\n }: {\n caption?: string;\n mimetype?: string;\n filename?: string;\n replyToMessageId?: string;\n jpegThumbnailSrc?: string | Buffer<any> | ReadStream;\n } = {}\n ) {\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketFiles.formatPhoneNumberToWhatsappPattern(to);\n const fileBuffer = typeof fileSrc === 'string' ? await getUrlBuffer(fileSrc) : fileSrc;\n\n let jpegThumbnailBuffer: Buffer<any> | undefined;\n if (typeof jpegThumbnailSrc === 'string') {\n jpegThumbnailBuffer = await getUrlBuffer(jpegThumbnailSrc);\n } else if (jpegThumbnailSrc instanceof ReadStream) {\n jpegThumbnailBuffer = await streamToBuffer(jpegThumbnailSrc);\n } else {\n jpegThumbnailBuffer = jpegThumbnailSrc;\n }\n\n let filename = 'mu-document';\n if (fileSrc instanceof ReadStream) {\n const fname = getFilenameFromStream(fileSrc);\n if (fname) filename = fname;\n } else if (typeof fileSrc === 'string') {\n filename = basename(fileSrc);\n }\n\n if (this.debug)\n this.logger?.debug('WHATSAPP', 'send file message', {\n jid,\n caption,\n mimetype,\n filename,\n replyToMessageId,\n includeJpegThumbnail: !!jpegThumbnailBuffer,\n });\n return await super.sendDocument(jid, fileBuffer, {\n caption,\n mimetype,\n filename,\n replyToMessageId,\n jpegThumbnail: jpegThumbnailBuffer,\n });\n }\n\n async sendAudioMessage(\n to: string,\n audioSrc: string | Buffer<any> | ReadStream,\n {\n filename,\n replyToMessageId,\n mimetype,\n seconds,\n }: { filename?: string; replyToMessageId?: string; mimetype?: string; seconds?: number } = {}\n ) {\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketFiles.formatPhoneNumberToWhatsappPattern(to);\n const audioBuffer = typeof audioSrc === 'string' ? await getUrlBuffer(audioSrc) : audioSrc;\n let durationInSeconds = seconds || (await getAudioFileDuration(audioBuffer, mimetype).catch(() => 0));\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'send audio message', {\n jid,\n mimetype,\n filename,\n seconds: durationInSeconds,\n replyToMessageId,\n });\n }\n\n return await super.sendAudio(jid, audioBuffer, {\n ...(filename && { filename }),\n ...(mimetype && { mimetype: mimetype }),\n ...(durationInSeconds && { seconds: durationInSeconds }),\n ...(replyToMessageId && { replyToMessageId: replyToMessageId }),\n });\n }\n\n /**\n * requirements:\n * * format .webp\n * * imageSize 512pxx512px\n * * maxSize: 100kb\n * * transparent background\n * @param to\n * @param imageSrc\n * @param replyToMessageId\n */\n async sendStickerMessage(\n to: string,\n imageSrc: string | Buffer<any> | ReadStream,\n { replyToMessageId }: { replyToMessageId?: string } = {}\n ) {\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketFiles.formatPhoneNumberToWhatsappPattern(to);\n const stickerBuffer = typeof imageSrc === 'string' ? await getUrlBuffer(imageSrc) : imageSrc;\n\n if (this.debug) this.logger?.debug('WHATSAPP', 'send sticker message', { jid, replyToMessageId });\n await super.sendSticker(jid, stickerBuffer, { replyToMessageId });\n }\n}\n","import { WhatsappSocketFiles, type WhatsappSocketFilesProps } from './whatsappSocket.files';\n\nexport class WhatsappSocket extends WhatsappSocketFiles {\n constructor(props: WhatsappSocketFilesProps) {\n super(props);\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/mongoAuthState.ts","../src/helpers.ts","../src/whatsappSocket.base.ts","../src/whatsappSocket.messages.ts","../src/whatsappSocket.stream.ts","../src/whatsappSocket.files.ts","../src/whatsappSocket.client.ts"],"names":["BufferJSON","_k","value","_","val","useMongoDBAuthState","collection","writeData","data","id","update","readData","removeData","creds","initAuthCreds","type","ids","proto","tasks","category","key","mongoAuthState_default","getTotalSeconds","msValue","ms","getUrlBuffer","url","arrayBuffer","getDurationFromStream","stream","mimeType","metadata","parseStream","error","getDurationFromBuffer","buffer","parseBuffer","getAudioFileDuration","audioFile","ReadStream","streamToBuffer","chunks","chunk","getFilenameFromStream","pathStr","basename","sleep","timeout","resolve","MIME_TYPES","pinoLogger","P","WhatsappSocketBase","_WhatsappSocketBase","phone","countryCode","strNumber","message","formattedPhone","query","qr","options","QRCode","pattern","length","result","pool","buildPool","block","chars","i","start","end","c","char","upperCaseResult","fileAuthStateDirectoryPath","mongoURL","mongoCollection","logger","onOpen","onClose","onQR","onReceiveMessages","onConnectionStatusChange","debug","printQRInTerminal","pairingPhone","customPairingCode","onPreConnectionSendMessageFailed","appName","sources","response","mongoClient","MongoClient","saveCreds","state","useMultiFileAuthState","makeCacheableSignalKeyStore","connectionAttempts","_pairingPhone","_debug","auth","version","connect","sock","makeWASocket","jid","connection","lastDisconnect","qrcode","pairing","code","shouldReconnect","DisconnectReason","statusCode","errorMessage","messages","socket","fs","autoConnect","WhatsappSocketMessages","_WhatsappSocketMessages","props","to","text","replyToMessageId","subtitle","title","buttons","buttonsValue","btn","buttonParamsJson","name","reminderOn","reminderDate","v","msg","generateWAMessageFromContent","index","WhatsappSocketStream","_WhatsappSocketStream","mimetype","messageContent","messageOptions","reject","err","filename","ext","imageBuffer","videoBuffer","audioBuffer","documentBuffer","stickerBuffer","WhatsappSocketFiles","_WhatsappSocketFiles","imageSrc","caption","imageData","videoSrc","gifPlayback","fileSrc","jpegThumbnailSrc","_filename","fileBuffer","jpegThumbnailBuffer","fname","audioSrc","seconds","durationInSeconds","WhatsappSocket"],"mappings":"4WAOA,IAAMA,CAAAA,CAAa,CACf,QAAA,CAAU,CAACC,EAAYC,CAAAA,GACf,MAAA,CAAO,SAASA,CAAK,CAAA,EAAKA,aAAiB,UAAA,EAAcA,CAAAA,EAAO,OAAS,QAAA,CAClE,CACH,KAAM,QAAA,CACN,IAAA,CAAM,OAAO,IAAA,CAAKA,CAAAA,EAAO,MAAQA,CAAK,CAAA,CAAE,SAAS,QAAQ,CAC7D,EAEGA,CAAAA,CAGX,OAAA,CAAS,CAACC,CAAAA,CAAWD,CAAAA,GAAe,CAChC,GAAI,OAAOA,GAAU,QAAA,EAAcA,CAAAA,GAAUA,EAAM,MAAA,GAAW,IAAA,EAAQA,EAAM,IAAA,GAAS,QAAA,CAAA,CAAW,CAC5F,IAAME,CAAAA,CAAMF,EAAM,IAAA,EAAQA,CAAAA,CAAM,MAChC,OAAO,OAAOE,GAAQ,QAAA,CAAW,MAAA,CAAO,KAAKA,CAAAA,CAAK,QAAQ,EAAI,MAAA,CAAO,IAAA,CAAKA,GAAO,EAAE,CACvF,CACA,OAAOF,CACX,CACJ,CAAA,CAEMG,EAAsB,MAAOC,CAAAA,EAAoB,CACnD,IAAMC,CAAAA,CAAY,CAACC,CAAAA,CAAWC,CAAAA,GAAe,CAEzC,IAAMC,CAAAA,CAAS,CAAE,IAAA,CAAM,CAAE,GADE,IAAA,CAAK,KAAA,CAAM,KAAK,SAAA,CAAUF,CAAAA,CAAMR,EAAW,QAAQ,CAAC,CAChC,CAAE,CAAA,CACjD,OAAOM,CAAAA,CAAW,SAAA,CAAU,CAAE,GAAA,CAAKG,CAAG,EAAGC,CAAAA,CAAQ,CAAE,OAAQ,IAAK,CAAC,CACrE,CAAA,CAEMC,CAAAA,CAAW,MAAOF,CAAAA,EAAe,CACnC,GAAI,CACA,IAAMD,EAAO,IAAA,CAAK,SAAA,CAAU,MAAMF,CAAAA,CAAW,OAAA,CAAQ,CAAE,GAAA,CAAKG,CAAG,CAAC,CAAC,CAAA,CACjE,OAAO,IAAA,CAAK,KAAA,CAAMD,EAAMR,CAAAA,CAAW,OAAO,CAC9C,CAAA,KAAgB,CACZ,OAAO,IACX,CACJ,CAAA,CAEMY,EAAa,MAAOH,CAAAA,EAAe,CACrC,GAAI,CACA,MAAMH,CAAAA,CAAW,SAAA,CAAU,CAAE,GAAA,CAAKG,CAAG,CAAC,EAC1C,CAAA,KAAa,CAAC,CAClB,CAAA,CAEMI,EAA8B,MAAMF,CAAAA,CAAS,OAAO,CAAA,EAAMG,aAAAA,GAEhE,OAAO,CACH,MAAO,CACH,KAAA,CAAAD,EACA,IAAA,CAAM,CACF,IAAK,MAAOE,CAAAA,CAA+BC,IAAkB,CACzD,IAAMR,EAA8B,EAAC,CACrC,aAAM,OAAA,CAAQ,GAAA,CACVQ,EAAI,GAAA,CAAI,MAAOP,GAAO,CAClB,IAAIP,EAAQ,MAAMS,CAAAA,CAAS,GAAGI,CAAI,CAAA,CAAA,EAAIN,CAAE,CAAA,CAAE,CAAA,CACtCM,IAAS,oBAAA,EAAwBb,CAAAA,GACjCA,EAAQe,OAAAA,CAAM,OAAA,CAAQ,oBAAoB,UAAA,CAAWf,CAAK,GAE9DM,CAAAA,CAAKC,CAAE,EAAIP,EACf,CAAC,CACL,CAAA,CACOM,CACX,EACA,GAAA,CAAK,MAAOA,GAAc,CACtB,IAAMU,EAAwB,EAAC,CAC/B,QAAWC,CAAAA,IAAY,MAAA,CAAO,KAAKX,CAAI,CAAA,CACnC,IAAA,IAAWC,CAAAA,IAAM,MAAA,CAAO,IAAA,CAAKD,EAAKW,CAAQ,CAAC,EAAG,CAC1C,IAAMjB,EAAQM,CAAAA,CAAKW,CAAQ,EAAEV,CAAE,CAAA,CACzBW,EAAM,CAAA,EAAGD,CAAQ,IAAIV,CAAE,CAAA,CAAA,CAC7BS,EAAM,IAAA,CAAKhB,CAAAA,CAAQK,EAAUL,CAAAA,CAAOkB,CAAG,EAAIR,CAAAA,CAAWQ,CAAG,CAAC,EAC9D,CAEJ,MAAM,OAAA,CAAQ,GAAA,CAAIF,CAAK,EAC3B,CACJ,CACJ,CAAA,CACA,SAAA,CAAW,IACAX,CAAAA,CAAUM,CAAAA,CAAO,OAAO,CAEvC,CACJ,EAEOQ,CAAAA,CAAQhB,CAAAA,CClFR,IAAMiB,EAAmBC,CAAAA,EACdC,CAAAA,CAAGD,CAAO,CAAA,CACT,GAAA,CAGnB,eAAsBE,CAAAA,CAAaC,CAAAA,CAAa,CAE5C,IAAMC,CAAAA,CAAc,MADH,MAAM,KAAA,CAAMD,CAAG,CAAA,EACG,WAAA,GAEnC,OADe,MAAA,CAAO,KAAKC,CAAW,CAE1C,CAEA,eAAeC,EAAAA,CAAsBC,CAAAA,CAAoBC,CAAAA,CAAoC,CACzF,GAAI,CACA,IAAMC,CAAAA,CAAW,MAAMC,WAAAA,CAAYH,CAAAA,CAAQ,CAAE,QAAA,CAAUC,CAAAA,EAAY,YAAa,CAAC,CAAA,CACjF,OAAO,IAAA,CAAK,KAAA,CAAMC,EAAS,MAAA,CAAO,QAAA,EAAY,CAAC,CACnD,CAAA,MAASE,EAAO,CACZ,MAAA,OAAA,CAAQ,MAAM,uBAAA,CAAyBA,CAAK,EACtCA,CACV,CAAA,OAAE,CACOJ,CAAAA,CAAO,SAAA,EACRA,EAAO,OAAA,GAEf,CACJ,CACA,eAAeK,GAAsBC,CAAAA,CAAgBL,CAAAA,CAAoC,CACrF,GAAI,CACA,IAAMC,CAAAA,CAAW,MAAMK,YAAYD,CAAAA,CAAQL,CAAAA,EAAY,YAAY,CAAA,CAAE,KAAA,CAAM,IAAM,IAAI,CAAA,CACrF,OAAOC,CAAAA,CAAW,IAAA,CAAK,MAAMA,CAAAA,CAAS,MAAA,CAAO,UAAY,CAAC,CAAA,CAAI,CAClE,CAAA,MAASE,CAAAA,CAAO,CACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,wBAAyBA,CAAK,CAAA,CACtCA,CACV,CACJ,CAEA,eAAsBI,CAAAA,CAAqBC,CAAAA,CAAgCR,EAAoC,CAC3G,OAAIQ,aAAqBC,UAAAA,CACdX,EAAAA,CAAsBU,EAAWR,CAAQ,CAAA,CAEzCI,GAAsBI,CAAAA,CAAWR,CAAQ,CAExD,CAEA,eAAsBU,EAAeX,CAAAA,CAAqC,CACtE,IAAMY,CAAAA,CAAmB,GAEzB,UAAA,IAAiBC,CAAAA,IAASb,EACtBY,CAAAA,CAAO,IAAA,CAAKC,CAAK,CAAA,CAGrB,OAAO,OAAO,MAAA,CAAOD,CAAM,CAC/B,CAEO,SAASE,EAAsBd,CAAAA,CAAwC,CAC1E,GAAIA,CAAAA,CAAO,IAAA,CAAM,CACb,IAAMe,CAAAA,CAAUf,EAAO,IAAA,CAAK,QAAA,GAC5B,OAAOgB,QAAAA,CAASD,CAAO,CAC3B,CAEJ,CAEO,IAAME,CAAAA,CAASC,GACX,IAAI,OAAA,CAASC,GAAY,UAAA,CAAWA,CAAAA,CAAiDxB,CAAAA,CAAGuB,CAAO,CAAC,CAAC,CAAA,CAG/FE,EAAwC,CAEjD,GAAA,CAAK,aACL,IAAA,CAAM,YAAA,CACN,IAAK,WAAA,CACL,GAAA,CAAK,YACL,IAAA,CAAM,YAAA,CACN,IAAK,WAAA,CACL,GAAA,CAAK,gBAGL,GAAA,CAAK,WAAA,CACL,IAAK,iBAAA,CACL,GAAA,CAAK,kBACL,GAAA,CAAK,kBAAA,CACL,KAAM,YAAA,CAGN,GAAA,CAAK,aACL,GAAA,CAAK,WAAA,CACL,IAAK,WAAA,CACL,IAAA,CAAM,aACN,GAAA,CAAK,WAAA,CACL,GAAA,CAAK,WAAA,CAGL,GAAA,CAAK,iBAAA,CACL,IAAK,oBAAA,CACL,IAAA,CAAM,0EACN,GAAA,CAAK,0BAAA,CACL,KAAM,mEAAA,CACN,GAAA,CAAK,gCACL,IAAA,CAAM,2EAAA,CACN,IAAK,YAAA,CACL,GAAA,CAAK,kBACL,GAAA,CAAK,8BAAA,CACL,KAAM,6BACV,CAAA,CC7EA,IAAMC,CAAAA,CAAkBC,EAAAA,CAAE,CAAE,KAAA,CAAO,QAAS,CAAC,CAAA,CAqBhCC,CAAAA,CAAN,MAAMC,CAAmB,CAClB,OACS,0BAAA,CACA,QAAA,CACA,gBAA0B,eAAA,CAC1B,MAAA,CACA,MACA,iBAAA,CACA,YAAA,CACA,kBACA,OAAA,CACX,gCAAA,CACA,OACA,OAAA,CACA,IAAA,CACA,yBACS,iBAAA,CACjB,OAAO,qBAA+B,KAAA,CACtC,OAAO,mBAAkC,IAAA,CAEzC,OAAO,kBAAkBC,CAAAA,CAAeC,CAAAA,CAAsBF,EAAmB,oBAAA,CAA8B,CAC3G,GAAIC,CAAAA,CAAM,QAAA,CAAS,iBAAiB,CAAA,CAAG,OAAOA,EAE9C,IAAIE,CAAAA,CAAYF,EAAM,OAAA,CAAQ,SAAA,CAAW,EAAE,CAAA,CAC3C,OAAIE,EAAU,UAAA,CAAW,IAAI,IAAGA,CAAAA,CAAYA,CAAAA,CAAU,UAAU,CAAC,CAAA,CAAA,CAC5DA,EAAU,UAAA,CAAWD,CAAW,IAAGC,CAAAA,CAAYD,CAAAA,CAAcC,CAAAA,CAAAA,CAE3DA,CACX,CAEA,OAAO,mCACHF,CAAAA,CACAC,CAAAA,CAAsBF,EAAmB,oBAAA,CACnC,CACN,GAAIC,CAAAA,CAAM,QAAA,CAAS,iBAAiB,CAAA,CAAG,OAAOA,EAE9C,IAAIE,CAAAA,CAAYH,EAAmB,iBAAA,CAAkBC,CAAAA,CAAOC,CAAW,CAAA,CACvE,OAAAC,EAAY,CAAA,EAAGA,CAAS,kBACjBA,CACX,CAEA,OAAO,oBAAA,CAAqB,CACxB,MAAAF,CAAAA,CACA,OAAA,CAAAG,EACA,WAAA,CAAAF,CAAAA,CAAc,KAAK,oBACvB,CAAA,CAIG,CACC,IAAMG,CAAAA,CAAiB,KAAK,iBAAA,CAAkBJ,CAAAA,CAAOC,CAAW,CAAA,CAC1DI,CAAAA,CAAQ,CAAE,GAAIF,CAAAA,EAAW,CAAE,IAAA,CAAM,SAAA,CAAUA,CAAO,CAAE,CAAG,EAC7D,OAAO,CAAA,cAAA,EAAiBC,CAAc,CAAA,CAAA,EAAIC,CAAK,EACnD,CAEA,aAAa,UACTC,CAAAA,CACAC,CAAAA,CAKI,EAAC,CACP,CACE,OAAOC,CAAAA,CAAO,SAAA,CAAUF,EAAI,CACxB,oBAAA,CAAsB,IACtB,KAAA,CAAO,GAAA,CACP,OAAQ,CAAA,CACR,GAAGC,CACP,CAAC,CACL,CAEA,aAAa,kBAAA,CAAmBD,EAAYC,CAAAA,CAAmD,EAAC,CAAG,CAC/F,OAAOC,CAAAA,CAAO,SAASF,CAAAA,CAAI,CAAE,KAAM,UAAA,CAAY,KAAA,CAAO,KAAM,GAAGC,CAAQ,CAAC,CAC5E,CAGA,OAAO,iBAAA,CAAkBE,CAAAA,CAAiBC,EAAS,CAAA,CAAG,CAElD,GAAI,CAACD,CAAAA,CAAQ,SAAS,GAAG,CAAA,EAAKA,EAAQ,MAAA,GAAWC,CAAAA,CAC7C,OAAOD,CAAAA,CAGX,IAAIE,EAAS,EAAA,CACTC,CAAAA,CAAiB,EAAC,CAEhBC,CAAAA,CAAaC,GAAkB,CACjC,IAAMC,EAAkB,EAAC,CAEzB,QAASC,CAAAA,CAAI,CAAA,CAAGA,EAAIF,CAAAA,CAAM,MAAA,CAAQE,IAC9B,GAAIF,CAAAA,CAAME,EAAI,CAAC,CAAA,GAAM,KAAOF,CAAAA,CAAME,CAAAA,CAAI,CAAC,CAAA,CAAG,CACtC,IAAMC,CAAAA,CAAQH,CAAAA,CAAM,WAAWE,CAAC,CAAA,CAC1BE,EAAMJ,CAAAA,CAAM,UAAA,CAAWE,EAAI,CAAC,CAAA,CAElC,QAASG,CAAAA,CAAIF,CAAAA,CAAOE,GAAKD,CAAAA,CAAKC,CAAAA,EAAAA,CAC1BJ,EAAM,IAAA,CAAK,MAAA,CAAO,aAAaI,CAAC,CAAC,EAGrCH,CAAAA,EAAK,EACT,MACID,CAAAA,CAAM,IAAA,CAAKD,EAAME,CAAC,CAAC,EAI3B,OAAOD,CACX,EAEA,IAAA,IAASC,CAAAA,CAAI,EAAGA,CAAAA,CAAIP,CAAAA,CAAQ,QAAUE,CAAAA,CAAO,MAAA,CAASD,EAAQM,CAAAA,EAAAA,CAAK,CAC/D,IAAMI,CAAAA,CAAOX,CAAAA,CAAQO,CAAC,CAAA,CAEtB,GAAII,IAAS,GAAA,CAAK,CACd,IAAMF,CAAAA,CAAMT,CAAAA,CAAQ,QAAQ,GAAA,CAAKO,CAAC,EAC5BF,CAAAA,CAAQL,CAAAA,CAAQ,MAAMO,CAAAA,CAAI,CAAA,CAAGE,CAAG,CAAA,CAEtCN,CAAAA,CAAOC,EAAUC,CAAK,CAAA,CACtBE,EAAIE,EACR,CAAA,KACIP,GAAUS,EAElB,CAGA,KAAOT,CAAAA,CAAO,MAAA,CAASD,GAAUE,CAAAA,CAAK,MAAA,EAClCD,GAAUC,CAAAA,CAAK,IAAA,CAAK,MAAM,IAAA,CAAK,MAAA,GAAWA,CAAAA,CAAK,MAAM,CAAC,CAAA,CAG1D,IAAMS,EAAkBV,CAAAA,CAAO,WAAA,GAC/B,OAAOU,CAAAA,CAAgB,OAAOX,CAAAA,CAAQW,CAAe,CACzD,CAEA,WAAA,CAAY,CACR,0BAAA,CAAAC,CAAAA,CACA,SAAAC,CAAAA,CACA,eAAA,CAAAC,EAAkB,eAAA,CAClB,MAAA,CAAAC,EACA,MAAA,CAAAC,CAAAA,CACA,QAAAC,CAAAA,CACA,IAAA,CAAAC,EACA,iBAAA,CAAAC,CAAAA,CACA,wBAAA,CAAAC,CAAAA,CACA,KAAA,CAAAC,CAAAA,CACA,kBAAAC,CAAAA,CACA,YAAA,CAAAC,EACA,iBAAA,CAAAC,CAAAA,CACA,iCAAAC,CAAAA,CACA,OAAA,CAAAC,CACJ,CAAA,CAA4B,CACxB,KAAK,OAAA,CAAUA,CAAAA,CACf,KAAK,QAAA,CAAWb,CAAAA,CAChB,KAAK,0BAAA,CAA6BD,CAAAA,CAClC,KAAK,eAAA,CAAkBE,CAAAA,CACvB,KAAK,MAAA,CAASC,CAAAA,CACd,KAAK,KAAA,CAAQM,CAAAA,CACb,KAAK,iBAAA,CAAoBC,CAAAA,CACzB,KAAK,YAAA,CAAeC,CAAAA,CACpB,KAAK,iBAAA,CAAoBC,CAAAA,CACzB,KAAK,MAAA,CAAS,IAAA,CACd,KAAK,gCAAA,CAAmCC,CAAAA,CACxC,KAAK,wBAAA,CAA2BL,CAAAA,CAChC,KAAK,iBAAA,CAAoBD,CAAAA,CACzB,KAAK,MAAA,CAASH,CAAAA,CACd,KAAK,OAAA,CAAUC,CAAAA,CACf,KAAK,IAAA,CAAOC,EAChB,CAEA,MAAc,wBAAA,EAA8D,CACxE,GAAI,CAEA,IAAMS,CAAAA,CAAU,CACZ,oGACA,mGACJ,CAAA,CAEA,QAAWjE,CAAAA,IAAOiE,CAAAA,CACd,GAAI,CACA,IAAMC,EAAW,MAAM,KAAA,CAAMlE,CAAG,CAAA,CAChC,GAAIkE,EAAS,EAAA,CAET,OAAA,CADa,MAAMA,CAAAA,CAAS,IAAA,IAChB,OAEpB,CAAA,KAAc,CACV,QACJ,CAIJ,OAAA,OAAA,CAAQ,IAAI,yCAAyC,CAAA,CAC9C,CAAC,CAAA,CAAG,GAAA,CAAM,UAAU,CAC/B,CAAA,MAAS3D,EAAO,CACZ,OAAA,OAAA,CAAQ,MAAM,yBAAA,CAA2BA,CAAK,EACvC,CAAC,CAAA,CAAG,IAAM,UAAU,CAC/B,CACJ,CAEA,MAAc,mBAA4E,CACtF,GAAI,CAAC,IAAA,CAAK,QAAA,CAAU,OAAO,EAAC,CAE5B,IAAM4D,CAAAA,CAAc,IAAIC,YAAY,IAAA,CAAK,QAAQ,EACjD,OAAA,MAAMD,CAAAA,CAAY,SAAQ,CAGnB,CAFYA,EAAY,EAAA,EAAG,CAAE,WAAW,IAAA,CAAK,eAAe,EAE/CA,CAAW,CACnC,CAEA,MAAc,YAAA,EAAuE,CACjF,GAAI,CAAC,KAAK,QAAA,EAAY,CAAC,KAAK,0BAAA,CACxB,MAAM,IAAI,KAAA,CAAM,gDAAgD,EAEpE,GAAI,CAAC,KAAK,QAAA,CAAU,CAChB,GAAM,CAAE,SAAA,CAAAE,EAAW,KAAA,CAAAC,CAAM,EAAI,MAAMC,qBAAAA,CAAsB,KAAK,0BAAoC,CAAA,CAClG,OAAO,CAAE,IAAA,CAAMD,EAAO,SAAA,CAAAD,CAAU,CACpC,CAEA,GAAM,CAACzF,CAAU,CAAA,CAAI,MAAM,KAAK,iBAAA,EAAkB,CAE5C,CAAE,KAAA,CAAA0F,CAAAA,CAAO,UAAAD,CAAU,CAAA,CAAI,MAAM1E,CAAAA,CAAoBf,CAAU,EAMjE,OAAO,CAAE,KALI,CACT,KAAA,CAAO0F,EAAM,KAAA,CACb,IAAA,CAAME,4BAA4BF,CAAAA,CAAM,IAAA,CAAM9C,CAAiB,CACnE,CAAA,CAEe,UAAA6C,CAAU,CAC7B,CAEA,MAAM,eAAA,CAAgB,CAClB,OAAA,CAAAlC,CAAAA,CACA,mBAAAsC,CAAAA,CAAqB,CAAA,CACrB,OAAAnB,CAAAA,CAAS,IAAA,CAAK,OACd,OAAA,CAAAC,CAAAA,CAAU,KAAK,OAAA,CACf,IAAA,CAAAC,EAAO,IAAA,CAAK,IAAA,CACZ,yBAAAE,CAAAA,CAA2B,IAAA,CAAK,yBAChC,YAAA,CAAcgB,CAAAA,CACd,MAAOC,CACX,CAAA,CASI,EAAC,CAA6B,CAC9B,IAAMd,CAAAA,CAAea,CAAAA,EAAiB,KAAK,YAAA,CACrC,CAAE,UAAAL,CAAAA,CAAW,IAAA,CAAAO,CAAK,CAAA,CAAI,MAAM,KAAK,YAAA,EAAa,CAC9CjB,EAAQgB,CAAAA,GAAW,MAAA,CAAY,KAAK,KAAA,CAAQA,CAAAA,CAG5CE,EAAU,MAAM,IAAA,CAAK,0BAAyB,CAE9CC,CAAAA,CAAU,SACL,IAAI,OAAA,CAASxD,CAAAA,EAAY,CAC5B,IAAMyD,CAAAA,CAAOC,GAAa,CACtB,OAAA,CAASH,EACT,MAAA,CAAQrD,CAAAA,CACR,QAAS,CAAC,IAAA,CAAK,SAAW,SAAA,CAAW,OAAA,CAAS,EAAE,CAAA,CAChD,eAAA,CAAiB,MACjB,wBAAA,CAA0B,IAAM,MAChC,eAAA,CAAkByD,CAAAA,EAAQA,EAAI,QAAA,CAAS,aAAa,EACpD,GAAG9C,CAAAA,CACH,kBAAmB,KAAA,CACd,IAAA,CAAAyC,CACT,CAAC,CAAA,CAGDG,EAAK,EAAA,CAAG,EAAA,CAAG,oBAAqB,MAAO/F,CAAAA,EAAW,CAC9C,GAAM,CAAE,WAAAkG,CAAAA,CAAY,cAAA,CAAAC,EAAgB,EAAA,CAAAjD,CAAG,EAAIlD,CAAAA,CAE3C,GAAIkD,EAAI,CAEJ,GADIyB,GAAO,IAAA,CAAK,MAAA,EAAQ,KAAK,UAAA,CAAY,kBAAA,CAAoB,CAAE,EAAA,CAAAzB,CAAG,CAAC,CAAA,CAC/D,IAAA,CAAK,kBAAmB,CACxB,IAAMkD,EAAS,MAAMzD,CAAAA,CAAmB,mBAAmBO,CAAAA,CAAI,CAAE,MAAO,IAAK,CAAC,EAAE,KAAA,CAC5E,IAAM,IACV,CAAA,CACA,OAAA,CAAQ,IAAIkD,CAAM,EACtB,CAGa,IAAA,CAAK,iBAAA,CACZzD,CAAAA,CAAmB,iBAAA,CAAkB,KAAK,iBAAiB,CAAA,CAC3D,WAEA0D,CAAAA,CAAUxB,CAAAA,CAAelC,EAAmB,iBAAA,CAAkBkC,CAAY,EAAI,IAAA,CAC9EyB,CAAAA,CAAOD,EAAU,MAAMN,CAAAA,CAAK,mBAAmBM,CAAO,CAAA,CAAI,KAE5D1B,CAAAA,EAAS,IAAA,CAAK,mBACd,IAAA,CAAK,MAAA,EAAQ,KAAK,UAAA,CAAY,iBAAA,CAAmB,CAAE,IAAA,CAAA2B,CAAAA,CAAM,aAAcD,CAAQ,CAAC,EAEpF,MAAM7B,CAAAA,GAAOtB,EAAIoD,CAAI,EACzB,CAEA,OAAQJ,CAAAA,EACJ,KAAK,YAAA,CAAc,CACXvB,CAAAA,EAAO,IAAA,CAAK,QAAQ,KAAA,CAAM,UAAA,CAAY,eAAe,CAAA,CACzDD,CAAAA,GAA2B,YAAY,CAAA,CACvC,KACJ,CAEA,KAAK,MAAA,CAAQ,CACLC,CAAAA,EAAO,IAAA,CAAK,QAAQ,IAAA,CAAK,UAAA,CAAY,iCAAiC,CAAA,CAC1E,IAAA,CAAK,OAASoB,CAAAA,CACd,MAAMzB,KAAS,CACfI,CAAAA,GAA2B,MAAM,CAAA,CACjCpC,CAAAA,CAAQ,KAAK,MAAM,CAAA,CACnB,KACJ,CAEA,KAAK,QAAS,CACV,IAAMiE,EACFd,CAAAA,EAAAA,EAAuB,CAAA,EACtBU,GAAgB,KAAA,EAAgB,MAAA,EAAQ,UAAA,GAAeK,gBAAAA,CAAiB,SAAA,CAEvEC,CAAAA,CAAcN,GAAgB,KAAA,EAAgB,MAAA,EAAQ,WACtDO,CAAAA,CAAeP,CAAAA,EAAgB,OAAO,OAAA,CAExCxB,CAAAA,EACA,KAAK,MAAA,EAAQ,IAAA,CAAK,WAAY,mBAAA,CAAqB,CAC/C,WAAA8B,CAAAA,CACA,YAAA,CAAAC,EACA,eAAA,CAAAH,CACJ,CAAC,CAAA,CAKDA,CAAAA,EAAmBd,GACfd,CAAAA,EAAO,IAAA,CAAK,QAAQ,IAAA,CAAK,UAAA,CAAY,iBAAiB,CAAA,CAC1D,MAAMvC,EAAMO,CAAAA,CAAmB,kBAAkB,EACjDL,CAAAA,CAAQwD,CAAAA,EAAS,CAAA,GAEbnB,CAAAA,EAAO,KAAK,MAAA,EAAQ,IAAA,CAAK,WAAY,iCAAiC,CAAA,CAC1E,MAAMJ,CAAAA,IAAU,CAChB,KAAK,MAAA,CAAS,IAAA,CACdjC,EAAQ,IAAA,CAAK,MAAM,GAGvBoC,CAAAA,GAA2B,OAAO,EAClC,KACJ,CACJ,CACJ,CAAC,CAAA,CAGDqB,EAAK,EAAA,CAAG,EAAA,CAAG,eAAgBV,CAAS,CAAA,CAGhC,KAAK,iBAAA,EAAqB,OAAO,KAAK,iBAAA,EAAsB,UAAA,EAC5DU,EAAK,EAAA,CAAG,EAAA,CAAG,kBAAmB,MAAO,CAAE,SAAAY,CAAAA,CAAU,IAAA,CAAAtG,CAAK,CAAA,GAAM,CACxD,KAAK,MAAA,EAAQ,IAAA,CAAK,UAAA,CAAY,mBAAA,CAAqB,CAAE,IAAA,CAAAA,EAAM,aAAA,CAAesG,CAAAA,CAAS,MAAO,CAAC,CAAA,CAC3F,KAAK,iBAAA,GAAoBA,CAAAA,CAAUtG,CAAI,EAa3C,CAAC,EAET,CAAC,CAAA,CAGCuG,EAAS,MAAMd,CAAAA,GACrB,OAAA,MAAM1D,CAAAA,CAAMO,EAAmB,kBAAkB,CAAA,CAE1CiE,CACX,CAEA,MAAM,uBAAkD,CACpD,OAAK,KAAK,MAAA,GACF,IAAA,CAAK,OAAO,IAAA,CAAK,MAAA,EAAQ,KAAK,UAAA,CAAY,gDAAgD,EAC9F,IAAA,CAAK,MAAA,CAAS,MAAM,IAAA,CAAK,eAAA,GAAkB,KAAA,CAAOrF,CAAAA,GAC9C,KAAK,gCAAA,GAAmCA,CAAK,EACtC,IAAA,CACV,CAAA,CAAA,CAGE,KAAK,MAChB,CAEA,MAAM,eAAA,EAAkB,CAChB,KAAK,MAAA,GACD,IAAA,CAAK,OAAO,IAAA,CAAK,MAAA,EAAQ,KAAK,UAAA,CAAY,oBAAoB,EAClE,IAAA,CAAK,MAAA,CAAO,IAAI,MAAS,CAAA,CACzB,KAAK,MAAA,CAAS,IAAA,EAEtB,CAEA,MAAM,cAAA,EAAiB,CAGnB,GAFA,MAAM,KAAK,eAAA,EAAgB,CAEvB,KAAK,QAAA,CAAU,CACf,GAAM,CAAC3B,CAAAA,CAAYuF,CAAW,CAAA,CAAI,MAAM,KAAK,iBAAA,EAAkB,CAE3D,KAAK,KAAA,EAAO,IAAA,CAAK,QAAQ,IAAA,CAAK,UAAA,CAAY,oDAAoD,CAAA,CAClG,MAAMvF,GAAY,UAAA,CAAW,EAAE,CAAA,CAC/B,MAAMuF,GAAa,KAAA,GACvB,MAAW,IAAA,CAAK,0BAAA,EACZ0B,GAAG,MAAA,CAAO,IAAA,CAAK,2BAA4B,CAAE,SAAA,CAAW,KAAM,KAAA,CAAO,IAAK,CAAC,EAEnF,CAEA,MAAM,eAAA,CAAgB,CAAE,aAAAhC,CAAAA,CAAc,WAAA,CAAAiC,EAAc,IAAK,CAAA,CAAsD,EAAC,CAAG,CAC/G,MAAM,IAAA,CAAK,cAAA,GACNA,CAAAA,GAEL,MAAM1E,EAAMO,CAAAA,CAAmB,kBAAkB,EACjD,MAAM,IAAA,CAAK,gBAAgB,CAAE,YAAA,CAAAkC,CAAa,CAAC,CAAA,EAC/C,CAEA,WAAA,EAAc,CACV,OAAO,IAAA,CAAK,MAAA,GAAW,MAAQ,IAAA,CAAK,MAAA,CAAO,OAAS,MACxD,CACJ,ECpbO,IAAMkC,CAAAA,CAAN,MAAMC,UAA+BtE,CAAmB,CAC3D,OAAO,oBAAA,CAA+B,KAAA,CAEtC,YAAYuE,CAAAA,CAAgC,CACxC,KAAA,CAAMA,CAAK,EACf,CAEA,MAAM,eAAA,CAAgBC,CAAAA,CAAYC,EAAcC,CAAAA,CAAyC,CACrF,MAAM,IAAA,CAAK,qBAAA,GAEX,IAAMnB,CAAAA,CAAMe,EAAuB,kCAAA,CAAmCE,CAAE,EAClE/D,CAAAA,CAAwC,CAC1C,GAAIiE,CAAAA,EAAoB,CAAE,OAAQ,CAAE,GAAA,CAAK,CAAE,EAAA,CAAIA,CAAiB,CAAE,CAAE,CACxE,EAEA,OAAO,IAAA,CAAK,QAAQ,WAAA,CAAYnB,CAAAA,CAAK,CAAE,IAAA,CAAAkB,CAAK,EAAGhE,CAAO,CAC1D,CAEA,MAAM,kBAAA,CACF+D,EACA,CAAE,QAAA,CAAAG,EAAU,KAAA,CAAAC,CAAAA,CAAO,QAAAC,CAAQ,CAAA,CACf,CACZ,GAAI,CAACD,GAAS,CAACC,CAAAA,CAAQ,OACnB,MAAM,IAAI,MAAM,+DAA+D,CAAA,CAGnF,MAAM,IAAA,CAAK,qBAAA,GAEX,IAAMtB,CAAAA,CAAMe,EAAuB,kCAAA,CAAmCE,CAAE,EAElEM,CAAAA,CAAgBD,CAAAA,EAChB,IAAKE,CAAAA,EAAQ,CACX,IAAMC,CAAAA,CAAqC,CAAE,aAAcD,CAAAA,CAAI,KAAM,EAEjEE,CAAAA,CACJ,OAAQ,MACJ,KAAK,CAAC,CAAEF,CAAAA,CAAkB,GAAA,CACtBE,EAAO,SAAA,CACPD,CAAAA,CAAiB,IAAOD,CAAAA,CAAkB,GAAA,CAC1C,MACJ,KAAK,CAAC,CAAEA,CAAAA,CAAmB,IAAA,CACvBE,EAAO,UAAA,CACPD,CAAAA,CAAiB,UAAaD,CAAAA,CAAmB,IAAA,CACjD,MACJ,KAAK,CAAC,CAAEA,CAAAA,CAAoB,GAAA,CACxBE,EAAO,UAAA,CACPD,CAAAA,CAAiB,aAAgBD,CAAAA,CAAoB,GAAA,CACrD,MACJ,KAAK,CAAC,CAAEA,CAAAA,CAAoB,KAAA,CACxBE,EAAO,WAAA,CACPD,CAAAA,CAAiB,MAASD,CAAAA,CAAoB,KAAA,CAC9C,MACJ,KAAK,CAAC,EAAGA,CAAAA,CAAuB,UAAA,EAAeA,EAAuB,YAAA,CAAA,CAClEE,CAAAA,CAAO,eACP,GAAM,CAAE,WAAAC,CAAAA,CAAY,YAAA,CAAAC,CAAa,CAAA,CAAIJ,CAAAA,CACrCC,EAAiB,aAAA,CAAiBD,CAAAA,CAAuB,aACzDC,CAAAA,CAAiB,kBAAA,CAAqBG,EAChC,IAAA,CAAK,KAAA,CAAM,CAAC,IAAI,IAAA,CAAKA,CAAY,CAAA,CAAI,GAAI,EACzC,IAAA,CAAK,KAAA,CAAM,KAAK,GAAA,EAAI,CAAI,GAAI,CAAA,CAAIjH,CAAAA,CAAgBgH,GAAc,IAAI,CAAA,CACxE,MACJ,QACID,CAAAA,CAAO,GACP,KACR,CAEA,OAAO,CAAE,IAAA,CAAAA,CAAAA,CAAM,iBAAkB,IAAA,CAAK,SAAA,CAAUD,CAAgB,CAAE,CACtE,CAAC,CAAA,CACA,MAAA,CAAQI,GAAMA,CAAAA,CAAE,IAAI,EAEnBC,CAAAA,CAAMC,4BAAAA,CACR/B,EACA,CACI,eAAA,CAAiB,CACb,OAAA,CAAS,CACL,mBAAoB1F,OAAAA,CAAM,OAAA,CAAQ,mBAAmB,MAAA,CAAO,CACxD,GAAI+G,CAAAA,EAAS,CACT,KAAM/G,OAAAA,CAAM,OAAA,CAAQ,mBAAmB,IAAA,CAAK,MAAA,CAAO,CAAE,IAAA,CAAM+G,CAAM,CAAC,CACtE,CAAA,CACA,GAAID,CAAAA,EAAY,CACZ,OAAQ9G,OAAAA,CAAM,OAAA,CAAQ,mBAAmB,MAAA,CAAO,MAAA,CAAO,CAAE,IAAA,CAAM8G,CAAS,CAAC,CAC7E,CAAA,CACA,GAAI,CAAC,CAACG,GAAc,MAAA,EAAU,CAC1B,kBAAmBjH,OAAAA,CAAM,OAAA,CAAQ,mBAAmB,iBAAA,CAAkB,MAAA,CAAO,CACzE,OAAA,CAASiH,CACb,CAAC,CACL,CACJ,CAAC,CACL,CACJ,CACJ,CAAA,CACA,CAAE,QAASvB,CAAI,CACnB,EAEA,OAAI,IAAA,CAAK,OACL,IAAA,CAAK,MAAA,EAAQ,MAAM,UAAA,CAAY,sBAAA,CAAwB,CACnD,GAAA,CAAAA,CAAAA,CACA,OAAQoB,CAAAA,CACR,IAAA,CAAMC,EACN,OAAA,CAASE,CACb,CAAC,CAAA,CAGE,IAAA,CAAK,QAAQ,YAAA,CAAavB,CAAAA,CAAK8B,EAAI,OAAA,CAAU,CAAE,UAAWA,CAAAA,CAAI,GAAA,CAAI,EAAI,CAAC,CAClF,CAEA,MAAM,uBAAA,CACFb,EACA,CACI,KAAA,CAAAI,EACA,QAAA,CAAAD,CAAAA,CACA,QAAAE,CACJ,CAAA,CAKY,CACZ,GAAI,CAACD,GAAS,CAACC,CAAAA,CAAQ,OACnB,MAAM,IAAI,MAAM,oEAAoE,CAAA,CAExF,MAAM,IAAA,CAAK,qBAAA,GAEX,IAAMtB,CAAAA,CAAMe,EAAuB,kCAAA,CAAmCE,CAAE,EAElEM,CAAAA,CAAeD,CAAAA,CAChB,OAAQO,CAAAA,EAAMA,CAAC,EACf,GAAA,CAAI,CAACL,EAAKQ,CAAAA,GACP,OAAOR,GAAQ,QAAA,CACT,CAAE,SAAU,CAAA,GAAA,EAAMQ,CAAK,GAAI,UAAA,CAAY,CAAE,YAAaR,CAAI,CAAA,CAAG,KAAM,CAAE,CAAA,CACrE,CAAE,QAAA,CAAU,CAAA,EAAGA,EAAI,EAAE,CAAA,CAAA,CAAI,WAAY,CAAE,WAAA,CAAaA,EAAI,KAAM,CAAA,CAAG,IAAA,CAAM,CAAE,CACnF,CAAA,CAEJ,OAAI,IAAA,CAAK,KAAA,EACL,KAAK,MAAA,EAAQ,KAAA,CAAM,WAAY,4BAAA,CAA8B,CACzD,IAAAxB,CAAAA,CACA,IAAA,CAAMqB,EACN,MAAA,CAAQD,CAAAA,CACR,QAASG,CACb,CAAC,EAGE,IAAA,CAAK,MAAA,EAAQ,YAAYvB,CAAAA,CAAK,CACjC,KAAMqB,CAAAA,CACN,GAAID,GAAY,CAAE,MAAA,CAAQA,CAAS,CAAA,CACnC,OAAA,CAASG,CACb,CAAC,CACL,CACJ,CAAA,CC9KO,IAAMU,EAAN,MAAMC,CAAAA,SAA6BpB,CAAuB,CAC7D,WAAA,CAAYE,EAAoC,CAC5C,KAAA,CAAMA,CAAK,EACf,CAEA,MAAgB,kBAAA,CACZC,CAAAA,CACA/F,EACAgC,CAAAA,CAYY,CACZ,MAAM,IAAA,CAAK,qBAAA,GAEX,IAAM8C,CAAAA,CAAMkC,EAAqB,kCAAA,CAAmCjB,CAAE,EAGhEzF,CAAAA,CAASN,CAAAA,YAAkB,OAASA,CAAAA,CAAS,MAAM,KAAK,cAAA,CAAeA,CAAkB,EAGzFiH,CAAAA,CAAWjF,CAAAA,CAAQ,UAAY,IAAA,CAAK,uBAAA,CAAwBA,EAAQ,QAAQ,CAAA,CAG5EkF,EAAiB,MAAM,IAAA,CAAK,kBAAkB5G,CAAAA,CAAQ2G,CAAAA,CAAUjF,CAAO,CAAA,CAEvEmF,CAAAA,CAAsB,CACxB,GAAInF,CAAAA,CAAQ,gBAAA,EAAoB,CAC5B,MAAA,CAAQ,CAAE,IAAK,CAAE,EAAA,CAAIA,EAAQ,gBAAiB,CAAE,CACpD,CACJ,CAAA,CAEA,OAAO,IAAA,CAAK,MAAA,EAAQ,YAAY8C,CAAAA,CAAKoC,CAAAA,CAAgBC,CAAc,CACvE,CAEA,MAAc,cAAA,CAAenH,CAAAA,CAAmC,CAC5D,OAAO,IAAI,QAAQ,CAACmB,CAAAA,CAASiG,IAAW,CACpC,IAAMxG,EAAmB,EAAC,CAC1BZ,EAAO,EAAA,CAAG,MAAA,CAASa,GAAUD,CAAAA,CAAO,IAAA,CAAK,OAAO,IAAA,CAAKC,CAAK,CAAC,CAAC,CAAA,CAC5Db,EAAO,EAAA,CAAG,OAAA,CAAUqH,GAAQD,CAAAA,CAAOC,CAAG,CAAC,CAAA,CACvCrH,CAAAA,CAAO,GAAG,KAAA,CAAO,IAAMmB,EAAQ,MAAA,CAAO,MAAA,CAAOP,CAAM,CAAC,CAAC,EACzD,CAAC,CACL,CAEQ,uBAAA,CAAwB0G,CAAAA,CAA0B,CACtD,IAAMC,CAAAA,CAAMD,EAAS,KAAA,CAAM,GAAG,EAAE,GAAA,EAAI,EAAG,aAAY,CACnD,OAAOlG,EAAWmG,CAAAA,EAAO,EAAE,GAAK,0BACpC,CAEA,MAAc,iBAAA,CACVjH,CAAAA,CACA2G,CAAAA,CACAjF,CAAAA,CAQ0B,CAC1B,GAAM,CAAC9C,CAAI,CAAA,CAAI+H,EAAS,KAAA,CAAM,GAAG,EAEjC,OAAQ/H,CAAAA,EACJ,KAAK,OAAA,CACD,OAAO,CACH,KAAA,CAAOoB,EACP,OAAA,CAAS0B,CAAAA,CAAQ,QACjB,QAAA,CAAAiF,CAAAA,CACA,SAAUjF,CAAAA,CAAQ,QACtB,EAEJ,KAAK,OAAA,CACD,OAAO,CACH,KAAA,CAAO1B,EACP,OAAA,CAAS0B,CAAAA,CAAQ,QACjB,QAAA,CAAAiF,CAAAA,CACA,SAAUjF,CAAAA,CAAQ,QAAA,CAClB,YAAaA,CAAAA,CAAQ,WAAA,EAAe,MACpC,aAAA,CAAeA,CAAAA,CAAQ,cACvB,GAAIA,CAAAA,CAAQ,SAAW,CAAE,OAAA,CAASA,EAAQ,OAAQ,CACtD,EAEJ,KAAK,OAAA,CACD,OAAIA,CAAAA,CAAQ,GAAA,CAED,CACH,KAAA,CAAO1B,CAAAA,CACP,SAAU,wBAAA,CACV,GAAA,CAAK,KACL,GAAI0B,CAAAA,CAAQ,SAAW,CAAE,OAAA,CAASA,EAAQ,OAAQ,CACtD,EAGG,CACH,KAAA,CAAO1B,EACP,QAAA,CAAA2G,CAAAA,CACA,SAAUjF,CAAAA,CAAQ,QAAA,CAClB,GAAIA,CAAAA,CAAQ,OAAA,EAAW,CAAE,OAAA,CAASA,CAAAA,CAAQ,OAAQ,CACtD,CAAA,CAEJ,QAEI,OAAO,CACH,SAAU1B,CAAAA,CACV,QAAA,CAAA2G,EACA,QAAA,CAAUjF,CAAAA,CAAQ,SAClB,OAAA,CAASA,CAAAA,CAAQ,QACjB,aAAA,CAAeA,CAAAA,CAAQ,aAC3B,CACR,CACJ,CAGA,MAAgB,SAAA,CACZ+D,EACAyB,CAAAA,CACAxF,CAAAA,CAII,EAAC,CACO,CACZ,OAAO,IAAA,CAAK,kBAAA,CAAmB+D,EAAIyB,CAAAA,CAAa,CAC5C,SAAUxF,CAAAA,CAAQ,QAAA,EAAY,YAC9B,OAAA,CAASA,CAAAA,CAAQ,QACjB,gBAAA,CAAkBA,CAAAA,CAAQ,gBAC9B,CAAC,CACL,CAEA,MAAgB,SAAA,CACZ+D,EACA0B,CAAAA,CACAzF,CAAAA,CAMI,EAAC,CACO,CACZ,OAAO,IAAA,CAAK,kBAAA,CAAmB+D,EAAI0B,CAAAA,CAAa,CAC5C,SAAUzF,CAAAA,CAAQ,QAAA,EAAY,YAC9B,OAAA,CAASA,CAAAA,CAAQ,QACjB,WAAA,CAAaA,CAAAA,CAAQ,YACrB,gBAAA,CAAkBA,CAAAA,CAAQ,iBAC1B,aAAA,CAAeA,CAAAA,CAAQ,aAC3B,CAAC,CACL,CAEA,MAAgB,SAAA,CACZ+D,EACA2B,CAAAA,CACA1F,CAAAA,CAKI,EAAC,CACO,CACZ,OAAO,IAAA,CAAK,kBAAA,CAAmB+D,EAAI2B,CAAAA,CAAa,CAC5C,SAAU1F,CAAAA,CAAQ,QAAA,EAAY,WAAA,CAC9B,QAAA,CAAUA,CAAAA,CAAQ,GAAA,CAAM,yBAA2B,EAAA,CACnD,GAAA,CAAKA,EAAQ,GAAA,CACb,OAAA,CAASA,EAAQ,OAAA,CACjB,gBAAA,CAAkBA,EAAQ,gBAC9B,CAAC,CACL,CAEA,MAAgB,aACZ+D,CAAAA,CACA4B,CAAAA,CACA3F,EAOY,CACZ,OAAO,KAAK,kBAAA,CAAmB+D,CAAAA,CAAI4B,EAAgB,CAC/C,QAAA,CAAU3F,EAAQ,QAAA,CAClB,QAAA,CAAUA,EAAQ,QAAA,CAClB,OAAA,CAASA,EAAQ,OAAA,CACjB,gBAAA,CAAkBA,EAAQ,gBAAA,CAC1B,aAAA,CAAeA,EAAQ,aAC3B,CAAC,CACL,CAEA,MAAgB,cACZ+D,CAAAA,CACA2B,CAAAA,CACA1F,EAGI,EAAC,CACO,CACZ,OAAO,IAAA,CAAK,UAAU+D,CAAAA,CAAI2B,CAAAA,CAAa,CACnC,GAAA,CAAK,IAAA,CACL,QAAS1F,CAAAA,CAAQ,OAAA,CACjB,iBAAkBA,CAAAA,CAAQ,gBAC9B,CAAC,CACL,CAEA,MAAgB,WAAA,CACZ+D,CAAAA,CACA6B,EACA5F,CAAAA,CAEI,GACQ,CACZ,MAAM,KAAK,qBAAA,EAAsB,CAEjC,IAAM8C,CAAAA,CAAMkC,CAAAA,CAAqB,mCAAmCjB,CAAE,CAAA,CAChEzF,EACFsH,CAAAA,YAAyB,MAAA,CAASA,EAAgB,MAAM,IAAA,CAAK,cAAA,CAAeA,CAAyB,CAAA,CAEnGT,CAAAA,CAAsB,CACxB,GAAInF,CAAAA,CAAQ,kBAAoB,CAC5B,MAAA,CAAQ,CAAE,GAAA,CAAK,CAAE,GAAIA,CAAAA,CAAQ,gBAAiB,CAAE,CACpD,CACJ,EAEA,OAAO,IAAA,CAAK,QAAQ,WAAA,CAAY8C,CAAAA,CAAK,CAAE,OAAA,CAASxE,CAAO,EAAG6G,CAAc,CAC5E,CACJ,CAAA,CCxOO,IAAMU,CAAAA,CAAN,MAAMC,UAA4Bf,CAAqB,CAC1D,OAAO,oBAAA,CAA+B,KAAA,CAEtC,YAAYjB,CAAAA,CAAkC,CAC1C,MAAMA,CAAK,EACf,CAEA,MAAM,gBAAA,CACFC,EACAgC,CAAAA,CACA,CAAE,QAAAC,CAAAA,CAAU,EAAA,CAAI,SAAAV,CAAS,CAAA,CAA6C,EAAC,CACzE,CACE,MAAM,IAAA,CAAK,qBAAA,GAEX,IAAMxC,CAAAA,CAAMgD,EAAoB,kCAAA,CAAmC/B,CAAE,EAC/DkC,CAAAA,CAAY,OAAOF,GAAa,QAAA,CAAW,MAAMnI,EAAamI,CAAQ,CAAA,CAAIA,EAEhF,OAAI,IAAA,CAAK,OAAO,IAAA,CAAK,MAAA,EAAQ,MAAM,UAAA,CAAY,oBAAA,CAAsB,CAAE,GAAA,CAAAjD,CAAAA,CAAK,OAAA,CAAAkD,CAAAA,CAAS,QAAA,CAAAV,CAAS,CAAC,CAAA,CACxF,MAAM,KAAK,SAAA,CAAUxC,CAAAA,CAAKmD,EAAW,CAAE,OAAA,CAAAD,EAAS,GAAIV,CAAAA,EAAY,CAAE,QAAA,CAAAA,CAAS,CAAG,CAAC,CAC1F,CAEA,MAAM,gBAAA,CACFvB,EACAmC,CAAAA,CACA,CACI,QAAAF,CAAAA,CAAU,EAAA,CACV,SAAAV,CAAAA,CACA,iBAAA,CAAmBa,EAAc,KACrC,CAAA,CAA0E,EAAC,CAC7E,CACE,MAAM,IAAA,CAAK,qBAAA,GAEX,IAAMrD,CAAAA,CAAMgD,EAAoB,kCAAA,CAAmC/B,CAAE,EAC/D0B,CAAAA,CAAc,OAAOS,GAAa,QAAA,CAAW,MAAMtI,EAAasI,CAAQ,CAAA,CAAIA,EAElF,OAAI,IAAA,CAAK,OAAO,IAAA,CAAK,MAAA,EAAQ,MAAM,UAAA,CAAY,oBAAA,CAAsB,CAAE,GAAA,CAAApD,CAAAA,CAAK,QAAAkD,CAAAA,CAAS,QAAA,CAAAV,EAAU,WAAA,CAAAa,CAAY,CAAC,CAAA,CACrG,MAAM,KAAK,SAAA,CAAUrD,CAAAA,CAAK2C,EAAa,CAAE,OAAA,CAAAO,EAAS,WAAA,CAAAG,CAAAA,CAAa,GAAIb,CAAAA,EAAY,CAAE,SAAAA,CAAS,CAAG,CAAC,CACzG,CAEA,MAAM,eAAA,CACFvB,CAAAA,CACAqC,CAAAA,CACA,CACI,OAAA,CAAAJ,CAAAA,CAAU,GACV,QAAA,CAAAf,CAAAA,CAAW,0EACX,gBAAA,CAAAhB,CAAAA,CACA,iBAAAoC,CAAAA,CACA,QAAA,CAAUC,CACd,CAAA,CAMI,GACN,CACE,MAAM,KAAK,qBAAA,EAAsB,CAEjC,IAAMxD,CAAAA,CAAMgD,CAAAA,CAAoB,mCAAmC/B,CAAE,CAAA,CAC/DwC,EAAa,OAAOH,CAAAA,EAAY,SAAW,MAAMxI,CAAAA,CAAawI,CAAO,CAAA,CAAIA,CAAAA,CAE3EI,EACA,OAAOH,CAAAA,EAAqB,SAC5BG,CAAAA,CAAsB,MAAM5I,EAAayI,CAAgB,CAAA,CAClDA,aAA4B3H,UAAAA,CACnC8H,CAAAA,CAAsB,MAAM7H,CAAAA,CAAe0H,CAAgB,EAE3DG,CAAAA,CAAsBH,CAAAA,CAG1B,IAAIf,CAAAA,CAAW,aAAA,CACf,GAAIc,CAAAA,YAAmB1H,UAAAA,CAAY,CAC/B,IAAM+H,CAAAA,CAAQ3H,EAAsBsH,CAAO,CAAA,CACvCK,IAAOnB,CAAAA,CAAWmB,CAAAA,EAC1B,MAAW,OAAOL,CAAAA,EAAY,WAC1Bd,CAAAA,CAAWtG,QAAAA,CAASoH,CAAO,CAAA,CAAA,CAG/B,OAAI,KAAK,KAAA,EACL,IAAA,CAAK,QAAQ,KAAA,CAAM,UAAA,CAAY,oBAAqB,CAChD,GAAA,CAAAtD,EACA,OAAA,CAAAkD,CAAAA,CACA,SAAAf,CAAAA,CACA,QAAA,CAAAK,CAAAA,CACA,gBAAA,CAAArB,CAAAA,CACA,oBAAA,CAAsB,CAAC,CAACuC,CAC5B,CAAC,CAAA,CACE,MAAM,KAAK,YAAA,CAAa1D,CAAAA,CAAKyD,EAAY,CAC5C,OAAA,CAAAP,EACA,QAAA,CAAAf,CAAAA,CACA,SAAAK,CAAAA,CACA,gBAAA,CAAArB,EACA,aAAA,CAAeuC,CACnB,CAAC,CACL,CAEA,MAAM,gBAAA,CACFzC,CAAAA,CACA2C,EACA,CACI,QAAA,CAAApB,EACA,gBAAA,CAAArB,CAAAA,CACA,SAAAgB,CAAAA,CACA,OAAA,CAAA0B,CACJ,CAAA,CAA2F,GAC7F,CACE,MAAM,KAAK,qBAAA,EAAsB,CAEjC,IAAM7D,CAAAA,CAAMgD,CAAAA,CAAoB,mCAAmC/B,CAAE,CAAA,CAC/D2B,EAAc,OAAOgB,CAAAA,EAAa,SAAW,MAAM9I,CAAAA,CAAa8I,CAAQ,CAAA,CAAIA,CAAAA,CAC9EE,EAAoBD,CAAAA,EAAY,MAAMnI,EAAqBkH,CAAAA,CAAaT,CAAQ,EAAE,KAAA,CAAM,IAAM,CAAC,CAAA,CAEnG,OAAI,KAAK,KAAA,EACL,IAAA,CAAK,QAAQ,KAAA,CAAM,UAAA,CAAY,qBAAsB,CACjD,GAAA,CAAAnC,EACA,QAAA,CAAAmC,CAAAA,CACA,SAAAK,CAAAA,CACA,OAAA,CAASsB,EACT,gBAAA,CAAA3C,CACJ,CAAC,CAAA,CAGE,MAAM,IAAA,CAAK,SAAA,CAAUnB,CAAAA,CAAK4C,CAAAA,CAAa,CAC1C,GAAIJ,CAAAA,EAAY,CAAE,QAAA,CAAAA,CAAS,EAC3B,GAAIL,CAAAA,EAAY,CAAE,QAAA,CAAUA,CAAS,EACrC,GAAI2B,CAAAA,EAAqB,CAAE,OAAA,CAASA,CAAkB,EACtD,GAAI3C,CAAAA,EAAoB,CAAE,gBAAA,CAAkBA,CAAiB,CACjE,CAAC,CACL,CAYA,MAAM,kBAAA,CACFF,EACAgC,CAAAA,CACA,CAAE,iBAAA9B,CAAiB,CAAA,CAAmC,EAAC,CACzD,CACE,MAAM,IAAA,CAAK,qBAAA,GAEX,IAAMnB,CAAAA,CAAMgD,EAAoB,kCAAA,CAAmC/B,CAAE,EAC/D6B,CAAAA,CAAgB,OAAOG,GAAa,QAAA,CAAW,MAAMnI,EAAamI,CAAQ,CAAA,CAAIA,EAEhF,IAAA,CAAK,KAAA,EAAO,KAAK,MAAA,EAAQ,KAAA,CAAM,WAAY,sBAAA,CAAwB,CAAE,IAAAjD,CAAAA,CAAK,gBAAA,CAAAmB,CAAiB,CAAC,CAAA,CAChG,MAAM,IAAA,CAAK,WAAA,CAAYnB,EAAK8C,CAAAA,CAAe,CAAE,iBAAA3B,CAAiB,CAAC,EACnE,CACJ,CAAA,KC9Ja4C,CAAAA,CAAN,cAA6BhB,CAAoB,CACpD,WAAA,CAAY/B,EAAiC,CACzC,KAAA,CAAMA,CAAK,EACf,CACJ","file":"index.js","sourcesContent":["import {\n type AuthenticationCreds,\n type SignalDataTypeMap,\n initAuthCreds,\n WAProto as proto,\n} from '@fadzzzslebew/baileys';\n\nconst BufferJSON = {\n replacer: (_k: string, value: any) => {\n if (Buffer.isBuffer(value) || value instanceof Uint8Array || value?.type === 'Buffer') {\n return {\n type: 'Buffer',\n data: Buffer.from(value?.data || value).toString('base64'),\n };\n }\n return value;\n },\n\n reviver: (_: string, value: any) => {\n if (typeof value === 'object' && !!value && (value.buffer === true || value.type === 'Buffer')) {\n const val = value.data || value.value;\n return typeof val === 'string' ? Buffer.from(val, 'base64') : Buffer.from(val || []);\n }\n return value;\n },\n};\n\nconst useMongoDBAuthState = async (collection: any) => {\n const writeData = (data: any, id: string) => {\n const informationToStore = JSON.parse(JSON.stringify(data, BufferJSON.replacer));\n const update = { $set: { ...informationToStore } };\n return collection.updateOne({ _id: id }, update, { upsert: true });\n };\n\n const readData = async (id: string) => {\n try {\n const data = JSON.stringify(await collection.findOne({ _id: id }));\n return JSON.parse(data, BufferJSON.reviver);\n } catch (error) {\n return null;\n }\n };\n\n const removeData = async (id: string) => {\n try {\n await collection.deleteOne({ _id: id });\n } catch (_a) {}\n };\n\n const creds: AuthenticationCreds = (await readData('creds')) || initAuthCreds();\n\n return {\n state: {\n creds,\n keys: {\n get: async (type: keyof SignalDataTypeMap, ids: string[]) => {\n const data: { [id: string]: any } = {};\n await Promise.all(\n ids.map(async (id) => {\n let value = await readData(`${type}-${id}`);\n if (type === 'app-state-sync-key' && value) {\n value = proto.Message.AppStateSyncKeyData.fromObject(value);\n }\n data[id] = value;\n })\n );\n return data;\n },\n set: async (data: any) => {\n const tasks: Promise<any>[] = [];\n for (const category of Object.keys(data)) {\n for (const id of Object.keys(data[category])) {\n const value = data[category][id];\n const key = `${category}-${id}`;\n tasks.push(value ? writeData(value, key) : removeData(key));\n }\n }\n await Promise.all(tasks);\n },\n },\n },\n saveCreds: () => {\n return writeData(creds, 'creds');\n },\n };\n};\n\nexport default useMongoDBAuthState;\n","import ms, { type StringValue } from 'ms';\nimport { parseBuffer, parseStream } from 'music-metadata';\nimport { ReadStream } from 'node:fs';\nimport { basename } from 'node:path';\n\nexport const getTotalSeconds = (msValue: StringValue) => {\n const value = ms(msValue);\n return value / 1000;\n};\n\nexport async function getUrlBuffer(url: string) {\n const response = await fetch(url);\n const arrayBuffer = await response.arrayBuffer();\n const buffer = Buffer.from(arrayBuffer);\n return buffer;\n}\n\nasync function getDurationFromStream(stream: ReadStream, mimeType?: string): Promise<number> {\n try {\n const metadata = await parseStream(stream, { mimeType: mimeType || 'audio/mpeg' });\n return Math.floor(metadata.format.duration || 0);\n } catch (error) {\n console.error('Error parsing stream:', error);\n throw error;\n } finally {\n if (!stream.destroyed) {\n stream.destroy();\n }\n }\n}\nasync function getDurationFromBuffer(buffer: Buffer, mimeType?: string): Promise<number> {\n try {\n const metadata = await parseBuffer(buffer, mimeType || 'audio/mpeg').catch(() => null);\n return metadata ? Math.floor(metadata.format.duration || 0) : 0;\n } catch (error) {\n console.error('Error parsing buffer:', error);\n throw error;\n }\n}\n\nexport async function getAudioFileDuration(audioFile: ReadStream | Buffer, mimeType?: string): Promise<number> {\n if (audioFile instanceof ReadStream) {\n return getDurationFromStream(audioFile, mimeType);\n } else {\n return getDurationFromBuffer(audioFile, mimeType);\n }\n}\n\nexport async function streamToBuffer(stream: ReadStream): Promise<Buffer> {\n const chunks: Buffer[] = [];\n\n for await (const chunk of stream) {\n chunks.push(chunk);\n }\n\n return Buffer.concat(chunks);\n}\n\nexport function getFilenameFromStream(stream: ReadStream): string | undefined {\n if (stream.path) {\n const pathStr = stream.path.toString();\n return basename(pathStr);\n }\n return undefined;\n}\n\nexport const sleep = (timeout: StringValue | number) => {\n return new Promise((resolve) => setTimeout(resolve, typeof timeout === 'number' ? timeout : ms(timeout)));\n};\n\nexport const MIME_TYPES: { [key: string]: string } = {\n // Images\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n png: 'image/png',\n gif: 'image/gif',\n webp: 'image/webp',\n bmp: 'image/bmp',\n svg: 'image/svg+xml',\n\n // Videos\n mp4: 'video/mp4',\n avi: 'video/x-msvideo',\n mov: 'video/quicktime',\n mkv: 'video/x-matroska',\n webm: 'video/webm',\n\n // Audio\n mp3: 'audio/mpeg',\n wav: 'audio/wav',\n ogg: 'audio/ogg',\n opus: 'audio/opus',\n aac: 'audio/aac',\n m4a: 'audio/mp4',\n\n // Documents\n pdf: 'application/pdf',\n doc: 'application/msword',\n docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n xls: 'application/vnd.ms-excel',\n xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n ppt: 'application/vnd.ms-powerpoint',\n pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n txt: 'text/plain',\n zip: 'application/zip',\n rar: 'application/x-rar-compressed',\n '7z': 'application/x-7z-compressed',\n};\n","// Baileys links\n// https://whiskeysockets.github.io/docs/tutorial-basics/sending-messages\n// https://github.com/WhiskeySockets/Baileys\n// https://github.com/ndalu-id/baileys-api\n// https://whiskeysockets.github.io/Baileys/\n// alternatives:\n// https://www.npmjs.com/package/mudslide\n// https://www.npmjs.com/package/whatsapp-web.js\n// https://www.npmjs.com/package/wbm\nimport {\n default as makeWASocket,\n DisconnectReason,\n makeCacheableSignalKeyStore,\n type MessageUpsertType,\n type UserFacingSocketConfig,\n type WAMessage,\n type WASocket,\n useMultiFileAuthState,\n type AuthenticationState,\n} from '@fadzzzslebew/baileys';\nimport { type StringValue } from 'ms';\nimport type { Logger as MyLogger } from 'stack-trace-logger';\nimport fs from 'node:fs';\nimport QRCode from 'qrcode';\nimport { type Collection, type Document as MongoDocument, MongoClient } from 'mongodb';\nimport P from 'pino';\nimport type { Boom } from '@hapi/boom';\nimport useMongoDBAuthState from './mongoAuthState.ts';\nimport { sleep } from './helpers.ts';\n\nconst pinoLogger: any = P({ level: 'silent' });\n\nexport type WhatsappSocketBaseProps = (\n | { mongoURL: string; fileAuthStateDirectoryPath?: string }\n | { mongoURL?: string; fileAuthStateDirectoryPath: string }\n) & {\n appName?: string;\n logger?: MyLogger;\n mongoCollection?: string;\n onOpen?: () => Promise<void> | void;\n onClose?: () => Promise<void> | void;\n onConnectionStatusChange?: (connectionStatus: 'connecting' | 'close' | 'open') => Promise<void> | void;\n onReceiveMessages?: (messages: WAMessage[], type: MessageUpsertType) => Promise<void> | void;\n onPreConnectionSendMessageFailed?: (error: Error | string) => Promise<void> | void;\n onQR?: (qr: string, code?: string | null) => Promise<void> | void;\n debug?: boolean;\n printQRInTerminal?: boolean;\n pairingPhone?: string;\n customPairingCode?: string;\n};\n\nexport class WhatsappSocketBase {\n protected socket: null | WASocket;\n protected readonly fileAuthStateDirectoryPath?: string;\n protected readonly mongoURL?: string;\n protected readonly mongoCollection: string = 'whatsapp-auth';\n protected readonly logger?: MyLogger;\n protected readonly debug?: boolean;\n protected readonly printQRInTerminal?: boolean;\n protected readonly pairingPhone?: string;\n protected readonly customPairingCode?: string;\n protected readonly appName?: string;\n private onPreConnectionSendMessageFailed?: (error: Error | string) => Promise<void> | void;\n private onOpen?: () => Promise<void> | void;\n private onClose?: () => Promise<void> | void;\n private onQR?: (qr: string, code?: string | null) => Promise<void> | void;\n private onConnectionStatusChange?: (connectionStatus: 'open' | 'close' | 'connecting') => Promise<void> | void;\n private readonly onReceiveMessages?: (messages: WAMessage[], type: MessageUpsertType) => Promise<void> | void;\n static DEFAULT_COUNTRY_CODE: string = '972';\n static CONNECTION_TIMEOUT: StringValue = '2s';\n\n static formatPhoneNumber(phone: string, countryCode: string = WhatsappSocketBase.DEFAULT_COUNTRY_CODE): string {\n if (phone.endsWith('@s.whatsapp.net')) return phone;\n\n let strNumber = phone.replace(/[^0-9]/g, '');\n if (strNumber.startsWith('05')) strNumber = strNumber.substring(1);\n if (!strNumber.startsWith(countryCode)) strNumber = countryCode + strNumber;\n\n return strNumber; // formatted Number should look like: '+972 051-333-4444' to: '972513334444'\n }\n\n static formatPhoneNumberToWhatsappPattern(\n phone: string,\n countryCode: string = WhatsappSocketBase.DEFAULT_COUNTRY_CODE\n ): string {\n if (phone.endsWith('@s.whatsapp.net')) return phone;\n\n let strNumber = WhatsappSocketBase.formatPhoneNumber(phone, countryCode);\n strNumber = `${strNumber}@s.whatsapp.net`; // formatted Number should look like: '972513334444@s.whatsapp.net'\n return strNumber;\n }\n\n static getWhatsappPhoneLink({\n phone,\n message,\n countryCode = this.DEFAULT_COUNTRY_CODE,\n }: {\n phone: string;\n countryCode?: string;\n message?: string;\n }) {\n const formattedPhone = this.formatPhoneNumber(phone, countryCode);\n const query = { ...(message && { text: encodeURI(message) }) };\n return `https://wa.me/${formattedPhone}?${query}`;\n }\n\n static async qrToImage(\n qr: string,\n options: {\n errorCorrectionLevel?: 'H' | 'L' | 'M';\n width?: number;\n margin?: number;\n [key: string]: any;\n } = {}\n ) {\n return QRCode.toDataURL(qr, {\n errorCorrectionLevel: 'H', // Changed to 'H' (High) for better reliability\n width: 400, // Increased size for better scanning\n margin: 2, // Ensure adequate margin\n ...options,\n });\n }\n\n static async qrToTerminalString(qr: string, options: { small?: boolean; [key: string]: any } = {}) {\n return QRCode.toString(qr, { type: 'terminal', small: true, ...options });\n }\n\n // only 8 alphanumeric (no more or less), patterns [a-z0-8] | aaaa[0-8] xxzzvvcc [zaq0-8]\n static randomPairingCode(pattern: string, length = 8) {\n // no randomness needed\n if (!pattern.includes('[') && pattern.length === length) {\n return pattern;\n }\n\n let result = '';\n let pool: string[] = [];\n\n const buildPool = (block: string) => {\n const chars: string[] = [];\n\n for (let i = 0; i < block.length; i++) {\n if (block[i + 1] === '-' && block[i + 2]) {\n const start = block.charCodeAt(i);\n const end = block.charCodeAt(i + 2);\n\n for (let c = start; c <= end; c++) {\n chars.push(String.fromCharCode(c));\n }\n\n i += 2;\n } else {\n chars.push(block[i]);\n }\n }\n\n return chars;\n };\n\n for (let i = 0; i < pattern.length && result.length < length; i++) {\n const char = pattern[i];\n\n if (char === '[') {\n const end = pattern.indexOf(']', i);\n const block = pattern.slice(i + 1, end);\n\n pool = buildPool(block);\n i = end;\n } else {\n result += char;\n }\n }\n\n // fill remaining from pool\n while (result.length < length && pool.length) {\n result += pool[Math.floor(Math.random() * pool.length)];\n }\n\n const upperCaseResult = result.toUpperCase();\n return upperCaseResult.padEnd(length, upperCaseResult);\n }\n\n constructor({\n fileAuthStateDirectoryPath,\n mongoURL,\n mongoCollection = 'whatsapp-auth',\n logger,\n onOpen,\n onClose,\n onQR,\n onReceiveMessages,\n onConnectionStatusChange,\n debug,\n printQRInTerminal,\n pairingPhone,\n customPairingCode,\n onPreConnectionSendMessageFailed,\n appName,\n }: WhatsappSocketBaseProps) {\n this.appName = appName;\n this.mongoURL = mongoURL;\n this.fileAuthStateDirectoryPath = fileAuthStateDirectoryPath;\n this.mongoCollection = mongoCollection;\n this.logger = logger;\n this.debug = debug;\n this.printQRInTerminal = printQRInTerminal;\n this.pairingPhone = pairingPhone;\n this.customPairingCode = customPairingCode;\n this.socket = null;\n this.onPreConnectionSendMessageFailed = onPreConnectionSendMessageFailed;\n this.onConnectionStatusChange = onConnectionStatusChange;\n this.onReceiveMessages = onReceiveMessages;\n this.onOpen = onOpen;\n this.onClose = onClose;\n this.onQR = onQR;\n }\n\n private async getLatestWhatsAppVersion(): Promise<[number, number, number]> {\n try {\n // Try multiple sources\n const sources = [\n 'https://raw.githubusercontent.com/WhiskeySockets/Baileys/master/src/Defaults/baileys-version.json',\n 'https://raw.githubusercontent.com/whiskeysockets/baileys/master/src/Defaults/baileys-version.json',\n ];\n\n for (const url of sources) {\n try {\n const response = await fetch(url);\n if (response.ok) {\n const data = await response.json();\n return data.version as [number, number, number];\n }\n } catch (err) {\n continue;\n }\n }\n\n // Fallback to a known working version\n console.log('Could not fetch version, using fallback');\n return [2, 3000, 1015901307]; // Recent version as of late 2024\n } catch (error) {\n console.error('Error fetching version:', error);\n return [2, 3000, 1015901307]; // Fallback\n }\n }\n\n private async getAuthCollection(): Promise<[] | [Collection<MongoDocument>, MongoClient]> {\n if (!this.mongoURL) return [];\n\n const mongoClient = new MongoClient(this.mongoURL);\n await mongoClient.connect();\n const collection = mongoClient.db().collection(this.mongoCollection);\n\n return [collection, mongoClient];\n }\n\n private async authenticate(): Promise<{ auth: AuthenticationState; saveCreds: any }> {\n if (!this.mongoURL && !this.fileAuthStateDirectoryPath) {\n throw new Error('fileAuthStateDirectoryPath/MongoURL is missing');\n }\n if (!this.mongoURL) {\n const { saveCreds, state } = await useMultiFileAuthState(this.fileAuthStateDirectoryPath as string);\n return { auth: state, saveCreds };\n }\n\n const [collection] = await this.getAuthCollection();\n\n const { state, saveCreds } = await useMongoDBAuthState(collection);\n const auth = {\n creds: state.creds,\n keys: makeCacheableSignalKeyStore(state.keys, pinoLogger as any),\n } as AuthenticationState;\n\n return { auth, saveCreds };\n }\n\n async startConnection({\n options,\n connectionAttempts = 3,\n onOpen = this.onOpen,\n onClose = this.onClose,\n onQR = this.onQR,\n onConnectionStatusChange = this.onConnectionStatusChange,\n pairingPhone: _pairingPhone,\n debug: _debug,\n }: {\n options?: UserFacingSocketConfig;\n debug?: boolean;\n pairingPhone?: string;\n connectionAttempts?: number;\n onOpen?: () => Promise<void> | void;\n onClose?: () => Promise<void> | void;\n onQR?: (qr: string, code?: string | null) => Promise<void> | void;\n onConnectionStatusChange?: (status: 'open' | 'close' | 'connecting') => Promise<void> | void;\n } = {}): Promise<WASocket | null> {\n const pairingPhone = _pairingPhone ?? this.pairingPhone;\n const { saveCreds, auth } = await this.authenticate();\n const debug = _debug === undefined ? this.debug : _debug;\n\n // Fetch latest Baileys version for better compatibility\n const version = await this.getLatestWhatsAppVersion();\n\n const connect = async (): Promise<WASocket | null> => {\n return new Promise((resolve) => {\n const sock = makeWASocket({\n version: version,\n logger: pinoLogger,\n browser: [this.appName || 'baileys', '1.0.0', ''], // ['Ubuntu', 'Chrome', '20.0.04'],\n syncFullHistory: false, // Don't sync full history on first connect\n shouldSyncHistoryMessage: () => false,\n shouldIgnoreJid: (jid) => jid.includes('@newsletter'), // Ignore newsletter\n ...options,\n printQRInTerminal: false,\n ...{ auth },\n });\n\n // CRITICAL: Handle connection updates properly\n sock.ev.on('connection.update', async (update) => {\n const { connection, lastDisconnect, qr } = update;\n\n if (qr) {\n if (debug) this.logger?.info('WHATSAPP', 'QR Code received', { qr });\n if (this.printQRInTerminal) {\n const qrcode = await WhatsappSocketBase.qrToTerminalString(qr, { small: true }).catch(\n () => null\n );\n console.log(qrcode);\n }\n\n // @ts-ignore\n const pair = this.customPairingCode\n ? WhatsappSocketBase.randomPairingCode(this.customPairingCode)\n : undefined;\n\n const pairing = pairingPhone ? WhatsappSocketBase.formatPhoneNumber(pairingPhone) : null;\n const code = pairing ? await sock.requestPairingCode(pairing) : null;\n\n if (debug && this.printQRInTerminal) {\n this.logger?.info('WHATSAPP', 'QR Pairing Code', { code, pairingPhone: pairing });\n }\n await onQR?.(qr, code);\n }\n\n switch (connection) {\n case 'connecting': {\n if (debug) this.logger?.debug('WHATSAPP', 'Connecting...');\n onConnectionStatusChange?.('connecting');\n break;\n }\n\n case 'open': {\n if (debug) this.logger?.info('WHATSAPP', 'Connection opened successfully!');\n this.socket = sock;\n await onOpen?.();\n onConnectionStatusChange?.('open');\n resolve(this.socket);\n break;\n }\n\n case 'close': {\n const shouldReconnect =\n connectionAttempts-- > 0 &&\n (lastDisconnect?.error as Boom)?.output?.statusCode !== DisconnectReason.loggedOut;\n\n const statusCode = (lastDisconnect?.error as Boom)?.output?.statusCode;\n const errorMessage = lastDisconnect?.error?.message;\n\n if (debug) {\n this.logger?.info('WHATSAPP', 'Connection closed', {\n statusCode,\n errorMessage,\n shouldReconnect,\n });\n }\n\n // IMPORTANT: Error code 515 (Stream Errored) after QR scan is NORMAL\n // The connection must restart after pairing - this is expected behavior\n if (shouldReconnect && connectionAttempts) {\n if (debug) this.logger?.info('WHATSAPP', 'Reconnecting...');\n await sleep(WhatsappSocketBase.CONNECTION_TIMEOUT);\n resolve(connect());\n } else {\n if (debug) this.logger?.warn('WHATSAPP', 'Logged out, clearing auth state');\n await onClose?.();\n this.socket = null;\n resolve(this.socket);\n }\n\n onConnectionStatusChange?.('close');\n break;\n }\n }\n });\n\n // Save credentials when they update\n sock.ev.on('creds.update', saveCreds);\n\n // Handle messages\n if (this.onReceiveMessages && typeof this.onReceiveMessages === 'function') {\n sock.ev.on('messages.upsert', async ({ messages, type }) => {\n this.logger?.info('WHATSAPP', 'Received messages', { type, totalMessages: messages.length });\n this.onReceiveMessages?.(messages, type);\n\n // const msg = messages[0]\n // if (!msg.key.fromMe && msg.message?.conversation) {\n // const sender = msg.key.remoteJid\n // const text = msg.message.conversation.toLowerCase()\n //\n // console.log(`📩 Message from ${sender}: ${text}`)\n //\n // if (text === 'hi') {\n // await sock.sendMessage(sender, { text: 'Hello! How can I help you today?' })\n // }\n // }\n });\n }\n });\n };\n\n const socket = await connect();\n await sleep(WhatsappSocketBase.CONNECTION_TIMEOUT);\n\n return socket;\n }\n\n async ensureSocketConnected(): Promise<WASocket | null> {\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection().catch((error: Error) => {\n this.onPreConnectionSendMessageFailed?.(error);\n return null;\n });\n }\n\n return this.socket;\n }\n\n async closeConnection() {\n if (this.socket) {\n if (this.debug) this.logger?.info('WHATSAPP', 'Closing connection');\n this.socket.end(undefined);\n this.socket = null;\n }\n }\n\n async clearAuthState() {\n await this.closeConnection();\n\n if (this.mongoURL) {\n const [collection, mongoClient] = await this.getAuthCollection();\n\n if (this.debug) this.logger?.info('WHATSAPP', 'Deleting auth state, required to scanning QR again');\n await collection?.deleteMany({});\n await mongoClient?.close();\n } else if (this.fileAuthStateDirectoryPath) {\n fs.rmSync(this.fileAuthStateDirectoryPath, { recursive: true, force: true });\n }\n }\n\n async resetConnection({ pairingPhone, autoConnect = true }: { pairingPhone?: string; autoConnect?: boolean } = {}) {\n await this.clearAuthState();\n if (!autoConnect) return;\n\n await sleep(WhatsappSocketBase.CONNECTION_TIMEOUT); // Wait a bit before reconnecting\n await this.startConnection({ pairingPhone });\n }\n\n isConnected() {\n return this.socket !== null && this.socket.user !== undefined;\n }\n}\n","import { type MiscMessageGenerationOptions, generateWAMessageFromContent } from '@fadzzzslebew/baileys';\nimport { WAProto as proto } from '@fadzzzslebew/baileys';\nimport { WhatsappSocketBase, type WhatsappSocketBaseProps } from './whatsappSocket.base.ts';\nexport type { WhatsappSocketBaseProps as WhatsappSocketMessagesProps } from './whatsappSocket.base.ts';\nimport { type StringValue } from 'ms';\nimport { getTotalSeconds } from './helpers.ts';\n\ntype ButtonURL = { label: string; url: string };\ntype ButtonCopy = { label: string; copy: string };\ntype ButtonPhone = { label: string; tel: string };\ntype ButtonEmail = { label: string; email: string };\ntype ButtonReminder = { label: string; reminderName: string } & (\n | { reminderOn?: StringValue; reminderDate: number }\n | { reminderOn: StringValue; reminderDate?: number | Date | string }\n);\n\ntype ButtonParamsJson = {\n display_text: string;\n url?: string;\n copy_code?: string;\n phone_number?: string;\n email?: string;\n reminder_name?: string;\n reminder_timestamp?: number;\n};\n\ntype CallToActionButtons = Array<\n ButtonURL | ButtonCopy | ButtonPhone\n // ButtonEmail | ButtonReminder // not supported\n>;\n\ntype CallToActionFullButtons = Array<ButtonURL | ButtonCopy | ButtonPhone | ButtonEmail | ButtonReminder>;\n\nexport class WhatsappSocketMessages extends WhatsappSocketBase {\n static DEFAULT_COUNTRY_CODE: string = '972';\n\n constructor(props: WhatsappSocketBaseProps) {\n super(props);\n }\n\n async sendTextMessage(to: string, text: string, replyToMessageId?: string): Promise<any> {\n await this.ensureSocketConnected();\n\n const jid = WhatsappSocketMessages.formatPhoneNumberToWhatsappPattern(to);\n const options: MiscMessageGenerationOptions = {\n ...(replyToMessageId && { quoted: { key: { id: replyToMessageId } } }),\n };\n\n return this.socket?.sendMessage(jid, { text }, options);\n }\n\n async sendButtonsMessage(\n to: string,\n { subtitle, title, buttons }: { title: string; subtitle?: string; buttons: CallToActionButtons }\n ): Promise<any> {\n if (!title || !buttons.length) {\n throw new Error('sendButtonsMessage: No title or buttons required field found.');\n }\n\n await this.ensureSocketConnected();\n\n const jid = WhatsappSocketMessages.formatPhoneNumberToWhatsappPattern(to);\n\n const buttonsValue = (buttons as CallToActionFullButtons)\n ?.map((btn) => {\n const buttonParamsJson: ButtonParamsJson = { display_text: btn.label };\n\n let name: string;\n switch (true) {\n case !!(btn as ButtonURL).url:\n name = 'cta_url';\n buttonParamsJson.url = (btn as ButtonURL).url;\n break;\n case !!(btn as ButtonCopy).copy:\n name = 'cta_copy';\n buttonParamsJson.copy_code = (btn as ButtonCopy).copy;\n break;\n case !!(btn as ButtonPhone).tel:\n name = 'cta_call';\n buttonParamsJson.phone_number = (btn as ButtonPhone).tel;\n break;\n case !!(btn as ButtonEmail).email:\n name = 'cta_email';\n buttonParamsJson.email = (btn as ButtonEmail).email;\n break;\n case !!((btn as ButtonReminder).reminderOn || (btn as ButtonReminder).reminderDate):\n name = 'cta_reminder';\n const { reminderOn, reminderDate } = btn as ButtonReminder;\n buttonParamsJson.reminder_name = (btn as ButtonReminder).reminderName;\n buttonParamsJson.reminder_timestamp = reminderDate\n ? Math.floor(+new Date(reminderDate) / 1000)\n : Math.floor(Date.now() / 1000) + getTotalSeconds(reminderOn ?? '0s');\n break;\n default:\n name = '';\n break;\n }\n\n return { name, buttonParamsJson: JSON.stringify(buttonParamsJson) };\n })\n .filter((v) => v.name);\n\n const msg = generateWAMessageFromContent(\n jid,\n {\n viewOnceMessage: {\n message: {\n interactiveMessage: proto.Message.InteractiveMessage.create({\n ...(title && {\n body: proto.Message.InteractiveMessage.Body.create({ text: title }),\n }),\n ...(subtitle && {\n footer: proto.Message.InteractiveMessage.Footer.create({ text: subtitle }),\n }),\n ...(!!buttonsValue?.length && {\n nativeFlowMessage: proto.Message.InteractiveMessage.NativeFlowMessage.create({\n buttons: buttonsValue,\n }),\n }),\n }),\n },\n },\n },\n { userJid: jid }\n );\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'send buttons message', {\n jid,\n footer: subtitle,\n body: title,\n buttons: buttonsValue,\n });\n }\n\n return this.socket?.relayMessage(jid, msg.message!, { messageId: msg.key.id! });\n }\n\n async sendReplyButtonsMessage(\n to: string,\n {\n title,\n subtitle,\n buttons,\n }: {\n title: string;\n subtitle?: string;\n buttons: Array<string | { id: number | string; label: string }>;\n }\n ): Promise<any> {\n if (!title || !buttons.length) {\n throw new Error('sendReplyButtonsMessage: No title or buttons required field found.');\n }\n await this.ensureSocketConnected();\n\n const jid = WhatsappSocketMessages.formatPhoneNumberToWhatsappPattern(to);\n\n const buttonsValue = buttons\n .filter((v) => v)\n .map((btn, index) =>\n typeof btn === 'string'\n ? { buttonId: `id-${index}`, buttonText: { displayText: btn }, type: 1 }\n : { buttonId: `${btn.id}`, buttonText: { displayText: btn.label }, type: 1 }\n );\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'send reply buttons message', {\n jid,\n text: title,\n footer: subtitle,\n buttons: buttonsValue,\n });\n }\n\n return this.socket?.sendMessage(jid, {\n text: title,\n ...(subtitle && { footer: subtitle }),\n buttons: buttonsValue /* type: UNKNOWN = 0, RESPONSE = 1, NATIVE_FLOW = 2 */,\n });\n }\n}\n","import { type AnyMessageContent } from '@fadzzzslebew/baileys';\nimport { Readable } from 'stream';\nimport { WhatsappSocketMessages, type WhatsappSocketMessagesProps } from './whatsappSocket.messages.ts';\nimport { MIME_TYPES } from './helpers.ts';\nexport { type WhatsappSocketMessagesProps as WhatsappSocketStreamProps } from './whatsappSocket.messages';\n\nexport class WhatsappSocketStream extends WhatsappSocketMessages {\n constructor(props: WhatsappSocketMessagesProps) {\n super(props);\n }\n\n protected async sendFileFromStream(\n to: string,\n stream: Readable | Buffer,\n options: {\n filename: string;\n mimetype?: string;\n caption?: string;\n replyToMessageId?: string;\n // File type specific options\n ptt?: boolean; // Push to talk (voice note)\n seconds?: number; // Duration for audio/video\n gifPlayback?: boolean; // For GIF videos\n // Additional options\n jpegThumbnail?: Buffer | string; // Thumbnail for videos/documents\n }\n ): Promise<any> {\n await this.ensureSocketConnected();\n\n const jid = WhatsappSocketStream.formatPhoneNumberToWhatsappPattern(to);\n\n // Convert stream to buffer if needed\n const buffer = stream instanceof Buffer ? stream : await this.streamToBuffer(stream as Readable);\n\n // Auto-detect mimetype if not provided\n const mimetype = options.mimetype || this.getMimetypeFromFilename(options.filename);\n\n // Determine message type based on mimetype\n const messageContent = await this.createFileMessage(buffer, mimetype, options);\n\n const messageOptions: any = {\n ...(options.replyToMessageId && {\n quoted: { key: { id: options.replyToMessageId } },\n }),\n };\n\n return this.socket?.sendMessage(jid, messageContent, messageOptions);\n }\n\n private async streamToBuffer(stream: Readable): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n stream.on('data', (chunk) => chunks.push(Buffer.from(chunk)));\n stream.on('error', (err) => reject(err));\n stream.on('end', () => resolve(Buffer.concat(chunks)));\n });\n }\n\n private getMimetypeFromFilename(filename: string): string {\n const ext = filename.split('.').pop()?.toLowerCase();\n return MIME_TYPES[ext || ''] || 'application/octet-stream';\n }\n\n private async createFileMessage(\n buffer: Buffer,\n mimetype: string,\n options: {\n filename: string;\n caption?: string;\n ptt?: boolean;\n seconds?: number;\n gifPlayback?: boolean;\n jpegThumbnail?: Buffer | string;\n }\n ): Promise<AnyMessageContent> {\n const [type] = mimetype.split('/');\n\n switch (type) {\n case 'image':\n return {\n image: buffer,\n caption: options.caption,\n mimetype,\n fileName: options.filename,\n };\n\n case 'video':\n return {\n video: buffer,\n caption: options.caption,\n mimetype,\n fileName: options.filename,\n gifPlayback: options.gifPlayback || false,\n jpegThumbnail: options.jpegThumbnail as string,\n ...(options.seconds && { seconds: options.seconds }),\n };\n\n case 'audio':\n if (options.ptt) {\n // Voice note\n return {\n audio: buffer,\n mimetype: 'audio/ogg; codecs=opus',\n ptt: true,\n ...(options.seconds && { seconds: options.seconds }),\n };\n }\n\n return {\n audio: buffer,\n mimetype,\n fileName: options.filename,\n ...(options.seconds && { seconds: options.seconds }),\n };\n\n default:\n // Document (PDF, DOC, etc.)\n return {\n document: buffer,\n mimetype,\n fileName: options.filename,\n caption: options.caption,\n jpegThumbnail: options.jpegThumbnail as string,\n };\n }\n }\n\n // Helper method to send specific file types\n protected async sendImage(\n to: string,\n imageBuffer: Buffer | Readable,\n options: {\n caption?: string;\n filename?: string;\n replyToMessageId?: string;\n } = {}\n ): Promise<any> {\n return this.sendFileFromStream(to, imageBuffer, {\n filename: options.filename || 'image.jpg',\n caption: options.caption,\n replyToMessageId: options.replyToMessageId,\n });\n }\n\n protected async sendVideo(\n to: string,\n videoBuffer: Buffer | Readable,\n options: {\n caption?: string;\n filename?: string;\n gifPlayback?: boolean;\n replyToMessageId?: string;\n jpegThumbnail?: Buffer;\n } = {}\n ): Promise<any> {\n return this.sendFileFromStream(to, videoBuffer, {\n filename: options.filename || 'video.mp4',\n caption: options.caption,\n gifPlayback: options.gifPlayback,\n replyToMessageId: options.replyToMessageId,\n jpegThumbnail: options.jpegThumbnail,\n });\n }\n\n protected async sendAudio(\n to: string,\n audioBuffer: Buffer | Readable,\n options: {\n filename?: string;\n ptt?: boolean; // Voice note\n seconds?: number;\n replyToMessageId?: string;\n } = {}\n ): Promise<any> {\n return this.sendFileFromStream(to, audioBuffer, {\n filename: options.filename || 'audio.mp3',\n mimetype: options.ptt ? 'audio/ogg; codecs=opus' : '',\n ptt: options.ptt,\n seconds: options.seconds,\n replyToMessageId: options.replyToMessageId,\n });\n }\n\n protected async sendDocument(\n to: string,\n documentBuffer: Buffer | Readable,\n options: {\n filename: string;\n caption?: string;\n mimetype?: string;\n replyToMessageId?: string;\n jpegThumbnail?: Buffer;\n }\n ): Promise<any> {\n return this.sendFileFromStream(to, documentBuffer, {\n filename: options.filename,\n mimetype: options.mimetype,\n caption: options.caption,\n replyToMessageId: options.replyToMessageId,\n jpegThumbnail: options.jpegThumbnail,\n });\n }\n\n protected async sendVoiceNote(\n to: string,\n audioBuffer: Buffer | Readable,\n options: {\n seconds?: number;\n replyToMessageId?: string;\n } = {}\n ): Promise<any> {\n return this.sendAudio(to, audioBuffer, {\n ptt: true,\n seconds: options.seconds,\n replyToMessageId: options.replyToMessageId,\n });\n }\n\n protected async sendSticker(\n to: string,\n stickerBuffer: Buffer | Readable,\n options: {\n replyToMessageId?: string;\n } = {}\n ): Promise<any> {\n await this.ensureSocketConnected();\n\n const jid = WhatsappSocketStream.formatPhoneNumberToWhatsappPattern(to);\n const buffer =\n stickerBuffer instanceof Buffer ? stickerBuffer : await this.streamToBuffer(stickerBuffer as Readable);\n\n const messageOptions: any = {\n ...(options.replyToMessageId && {\n quoted: { key: { id: options.replyToMessageId } },\n }),\n };\n\n return this.socket?.sendMessage(jid, { sticker: buffer }, messageOptions);\n }\n}\n","import { ReadStream } from 'node:fs';\n\nimport { WhatsappSocketStream, type WhatsappSocketStreamProps } from './whatsappSocket.stream';\nexport { type WhatsappSocketStreamProps as WhatsappSocketFilesProps } from './whatsappSocket.stream';\nimport { getAudioFileDuration, getFilenameFromStream, getUrlBuffer, streamToBuffer } from './helpers.ts';\nimport { basename } from 'node:path';\n\nexport class WhatsappSocketFiles extends WhatsappSocketStream {\n static DEFAULT_COUNTRY_CODE: string = '972';\n\n constructor(props: WhatsappSocketStreamProps) {\n super(props);\n }\n\n async sendImageMessage(\n to: string,\n imageSrc: string | Buffer<any> | ReadStream,\n { caption = '', filename }: { caption?: string; filename?: string } = {}\n ) {\n await this.ensureSocketConnected();\n\n const jid = WhatsappSocketFiles.formatPhoneNumberToWhatsappPattern(to);\n const imageData = typeof imageSrc === 'string' ? await getUrlBuffer(imageSrc) : imageSrc;\n\n if (this.debug) this.logger?.debug('WHATSAPP', 'send image message', { jid, caption, filename });\n return await this.sendImage(jid, imageData, { caption, ...(filename && { filename }) });\n }\n\n async sendVideoMessage(\n to: string,\n videoSrc: string | Buffer<any> | ReadStream,\n {\n caption = '',\n filename,\n sendAsGifPlayback: gifPlayback = false,\n }: { caption?: string; sendAsGifPlayback?: boolean; filename?: string } = {}\n ) {\n await this.ensureSocketConnected();\n\n const jid = WhatsappSocketFiles.formatPhoneNumberToWhatsappPattern(to);\n const videoBuffer = typeof videoSrc === 'string' ? await getUrlBuffer(videoSrc) : videoSrc;\n\n if (this.debug) this.logger?.debug('WHATSAPP', 'send video message', { jid, caption, filename, gifPlayback });\n return await this.sendVideo(jid, videoBuffer, { caption, gifPlayback, ...(filename && { filename }) });\n }\n\n async sendFileMessage(\n to: string,\n fileSrc: string | Buffer<any> | ReadStream,\n {\n caption = '',\n mimetype = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n replyToMessageId,\n jpegThumbnailSrc,\n filename: _filename,\n }: {\n caption?: string;\n mimetype?: string;\n filename?: string;\n replyToMessageId?: string;\n jpegThumbnailSrc?: string | Buffer<any> | ReadStream;\n } = {}\n ) {\n await this.ensureSocketConnected();\n\n const jid = WhatsappSocketFiles.formatPhoneNumberToWhatsappPattern(to);\n const fileBuffer = typeof fileSrc === 'string' ? await getUrlBuffer(fileSrc) : fileSrc;\n\n let jpegThumbnailBuffer: Buffer<any> | undefined;\n if (typeof jpegThumbnailSrc === 'string') {\n jpegThumbnailBuffer = await getUrlBuffer(jpegThumbnailSrc);\n } else if (jpegThumbnailSrc instanceof ReadStream) {\n jpegThumbnailBuffer = await streamToBuffer(jpegThumbnailSrc);\n } else {\n jpegThumbnailBuffer = jpegThumbnailSrc;\n }\n\n let filename = 'mu-document';\n if (fileSrc instanceof ReadStream) {\n const fname = getFilenameFromStream(fileSrc);\n if (fname) filename = fname;\n } else if (typeof fileSrc === 'string') {\n filename = basename(fileSrc);\n }\n\n if (this.debug)\n this.logger?.debug('WHATSAPP', 'send file message', {\n jid,\n caption,\n mimetype,\n filename,\n replyToMessageId,\n includeJpegThumbnail: !!jpegThumbnailBuffer,\n });\n return await this.sendDocument(jid, fileBuffer, {\n caption,\n mimetype,\n filename,\n replyToMessageId,\n jpegThumbnail: jpegThumbnailBuffer,\n });\n }\n\n async sendAudioMessage(\n to: string,\n audioSrc: string | Buffer<any> | ReadStream,\n {\n filename,\n replyToMessageId,\n mimetype,\n seconds,\n }: { filename?: string; replyToMessageId?: string; mimetype?: string; seconds?: number } = {}\n ) {\n await this.ensureSocketConnected();\n\n const jid = WhatsappSocketFiles.formatPhoneNumberToWhatsappPattern(to);\n const audioBuffer = typeof audioSrc === 'string' ? await getUrlBuffer(audioSrc) : audioSrc;\n let durationInSeconds = seconds || (await getAudioFileDuration(audioBuffer, mimetype).catch(() => 0));\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'send audio message', {\n jid,\n mimetype,\n filename,\n seconds: durationInSeconds,\n replyToMessageId,\n });\n }\n\n return await this.sendAudio(jid, audioBuffer, {\n ...(filename && { filename }),\n ...(mimetype && { mimetype: mimetype }),\n ...(durationInSeconds && { seconds: durationInSeconds }),\n ...(replyToMessageId && { replyToMessageId: replyToMessageId }),\n });\n }\n\n /**\n * requirements:\n * * format .webp\n * * imageSize 512pxx512px\n * * maxSize: 100kb\n * * transparent background\n * @param to\n * @param imageSrc\n * @param replyToMessageId\n */\n async sendStickerMessage(\n to: string,\n imageSrc: string | Buffer<any> | ReadStream,\n { replyToMessageId }: { replyToMessageId?: string } = {}\n ) {\n await this.ensureSocketConnected();\n\n const jid = WhatsappSocketFiles.formatPhoneNumberToWhatsappPattern(to);\n const stickerBuffer = typeof imageSrc === 'string' ? await getUrlBuffer(imageSrc) : imageSrc;\n\n if (this.debug) this.logger?.debug('WHATSAPP', 'send sticker message', { jid, replyToMessageId });\n await this.sendSticker(jid, stickerBuffer, { replyToMessageId });\n }\n}\n","import { WhatsappSocketFiles, type WhatsappSocketFilesProps } from './whatsappSocket.files';\n\nexport class WhatsappSocket extends WhatsappSocketFiles {\n constructor(props: WhatsappSocketFilesProps) {\n super(props);\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hdriel/whatsapp-socket",
3
- "version": "1.0.2",
3
+ "version": "1.0.3",
4
4
  "description": "",
5
5
  "author": "Hadriel Benjo (https://github.com/hdriel)",
6
6
  "type": "module",