@hdriel/whatsapp-socket 1.0.3 → 1.0.4
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 +8 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# @hdriel/whatsapp-socket
|
|
1
|
+
# [@hdriel/whatsapp-socket](https://www.npmjs.com/package/@hdriel/whatsapp-socket)
|
|
2
2
|
|
|
3
3
|
A TypeScript/JavaScript wrapper library for WhatsApp Web Socket communication, built on top of [@fadzzzslebew/baileys](https://github.com/fadzzzslebew/baileys). This package provides a simplified, high-level API for interacting with WhatsApp Web with support for multi-device connections.
|
|
4
4
|
|
|
@@ -22,6 +22,12 @@ This project is not affiliated, associated, authorized, endorsed by, or in any w
|
|
|
22
22
|
- 🎨 Send stickers (WebP format, up to 5MB)
|
|
23
23
|
- 💾 Session persistence (file-based or MongoDB)
|
|
24
24
|
- 📝 Full TypeScript support
|
|
25
|
+
- FULL DEMO SERVER & CLIENT: [github repo](https://github.com/hdriel/whatsapp-socket)
|
|
26
|
+
- demo-client directory run ```npm run build```
|
|
27
|
+
- demo-server directory run ```npm start```
|
|
28
|
+
- open browser ```http://localhost:1010```
|
|
29
|
+
|
|
30
|
+

|
|
25
31
|
|
|
26
32
|
## ⚠️ Important: Server Requirements
|
|
27
33
|
|
|
@@ -537,4 +543,4 @@ See [CHANGELOG.md](CHANGELOG.md) for version history and updates.
|
|
|
537
543
|
|
|
538
544
|
---
|
|
539
545
|
|
|
540
|
-
Made with ❤️ for developers who want powerful Whatsapp Bot utilities without the complexity.
|
|
546
|
+
Made with ❤️ for developers who want powerful Whatsapp Bot utilities without the complexity.
|
package/dist/index.cjs.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","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"]}
|
|
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 | undefined }\n | { mongoURL?: string | undefined; 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
|
@@ -6,9 +6,9 @@ import { Logger } from 'stack-trace-logger';
|
|
|
6
6
|
|
|
7
7
|
type WhatsappSocketBaseProps = ({
|
|
8
8
|
mongoURL: string;
|
|
9
|
-
fileAuthStateDirectoryPath?: string;
|
|
9
|
+
fileAuthStateDirectoryPath?: string | undefined;
|
|
10
10
|
} | {
|
|
11
|
-
mongoURL?: string;
|
|
11
|
+
mongoURL?: string | undefined;
|
|
12
12
|
fileAuthStateDirectoryPath: string;
|
|
13
13
|
}) & {
|
|
14
14
|
appName?: string;
|
package/dist/index.d.ts
CHANGED
|
@@ -6,9 +6,9 @@ import { Logger } from 'stack-trace-logger';
|
|
|
6
6
|
|
|
7
7
|
type WhatsappSocketBaseProps = ({
|
|
8
8
|
mongoURL: string;
|
|
9
|
-
fileAuthStateDirectoryPath?: string;
|
|
9
|
+
fileAuthStateDirectoryPath?: string | undefined;
|
|
10
10
|
} | {
|
|
11
|
-
mongoURL?: string;
|
|
11
|
+
mongoURL?: string | undefined;
|
|
12
12
|
fileAuthStateDirectoryPath: string;
|
|
13
13
|
}) & {
|
|
14
14
|
appName?: string;
|
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","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.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"]}
|
|
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.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 | undefined }\n | { mongoURL?: string | undefined; 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"]}
|