@hdriel/whatsapp-socket 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +525 -11
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/mongoAuthState.ts","../src/whatsappSocket.base.ts","../src/helpers.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","pinoLogger","P","WhatsappSocketBase","_WhatsappSocketBase","phone","countryCode","strNumber","message","formattedPhone","query","qr","options","QRCode","pattern","length","result","pool","buildPool","block","chars","i","start","end","c","char","upperCaseResult","fileAuthStateDirectoryPath","mongoURL","mongoCollection","logger","onOpen","onClose","onQR","onReceiveMessages","onConnectionStatusChange","debug","printQRInTerminal","pairingPhone","customPairingCode","allowUseLastVersion","mongoClient","MongoClient","saveCreds","state","useMultiFileAuthState","makeCacheableSignalKeyStore","connectionAttempts","_pairingPhone","_debug","auth","version","isLatest","fetchLatestBaileysVersion","connect","sock","makeWASocket","jid","connection","lastDisconnect","qrcode","pairing","code","shouldReconnect","DisconnectReason","statusCode","errorMessage","messages","fs","resolve","getTotalSeconds","msValue","ms","getUrlBuffer","url","arrayBuffer","getDurationFromStream","stream","mimeType","metadata","parseStream","error","getDurationFromBuffer","buffer","parseBuffer","getAudioFileDuration","audioFile","ReadStream","streamToBuffer","chunks","chunk","getFilenameFromStream","pathStr","basename","WhatsappSocketMessages","_WhatsappSocketMessages","props","to","text","replyToMessageId","subtitle","title","buttons","buttonsValue","btn","buttonParamsJson","name","reminderOn","reminderDate","v","msg","generateWAMessageFromContent","displayText","index","WhatsappSocketStream","_WhatsappSocketStream","mimetype","messageContent","messageOptions","reject","err","filename","ext","imageBuffer","videoBuffer","audioBuffer","documentBuffer","stickerBuffer","WhatsappSocketFiles","_WhatsappSocketFiles","imageSrc","caption","imageData","videoSrc","gifPlayback","fileSrc","jpegThumbnailSrc","_filename","fileBuffer","jpegThumbnailBuffer","fname","audioSrc","seconds","durationInSeconds","WhatsappSocket"],"mappings":"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","file":"index.js","sourcesContent":["import {\n type AuthenticationCreds,\n type SignalDataTypeMap,\n initAuthCreds,\n WAProto as proto,\n} from '@fadzzzslebew/baileys';\n\nconst BufferJSON = {\n replacer: (_k: string, value: any) => {\n if (Buffer.isBuffer(value) || value instanceof Uint8Array || value?.type === 'Buffer') {\n return {\n type: 'Buffer',\n data: Buffer.from(value?.data || value).toString('base64'),\n };\n }\n return value;\n },\n\n reviver: (_: string, value: any) => {\n if (typeof value === 'object' && !!value && (value.buffer === true || value.type === 'Buffer')) {\n const val = value.data || value.value;\n return typeof val === 'string' ? Buffer.from(val, 'base64') : Buffer.from(val || []);\n }\n return value;\n },\n};\n\nconst useMongoDBAuthState = async (collection: any) => {\n const writeData = (data: any, id: string) => {\n const informationToStore = JSON.parse(JSON.stringify(data, BufferJSON.replacer));\n const update = { $set: { ...informationToStore } };\n return collection.updateOne({ _id: id }, update, { upsert: true });\n };\n\n const readData = async (id: string) => {\n try {\n const data = JSON.stringify(await collection.findOne({ _id: id }));\n return JSON.parse(data, BufferJSON.reviver);\n } catch (error) {\n return null;\n }\n };\n\n const removeData = async (id: string) => {\n try {\n await collection.deleteOne({ _id: id });\n } catch (_a) {}\n };\n\n const creds: AuthenticationCreds = (await readData('creds')) || initAuthCreds();\n\n return {\n state: {\n creds,\n keys: {\n get: async (type: keyof SignalDataTypeMap, ids: string[]) => {\n const data: { [id: string]: any } = {};\n await Promise.all(\n ids.map(async (id) => {\n let value = await readData(`${type}-${id}`);\n if (type === 'app-state-sync-key' && value) {\n value = proto.Message.AppStateSyncKeyData.fromObject(value);\n }\n data[id] = value;\n })\n );\n return data;\n },\n set: async (data: any) => {\n const tasks: Promise<any>[] = [];\n for (const category of Object.keys(data)) {\n for (const id of Object.keys(data[category])) {\n const value = data[category][id];\n const key = `${category}-${id}`;\n tasks.push(value ? writeData(value, key) : removeData(key));\n }\n }\n await Promise.all(tasks);\n },\n },\n },\n saveCreds: () => {\n return writeData(creds, 'creds');\n },\n };\n};\n\nexport default useMongoDBAuthState;\n","// Baileys links\n// https://whiskeysockets.github.io/docs/tutorial-basics/sending-messages\n// https://github.com/WhiskeySockets/Baileys\n// https://github.com/ndalu-id/baileys-api\n// https://whiskeysockets.github.io/Baileys/\n// alternatives:\n// https://www.npmjs.com/package/mudslide\n// https://www.npmjs.com/package/whatsapp-web.js\n// https://www.npmjs.com/package/wbm\nimport {\n default as makeWASocket,\n DisconnectReason,\n fetchLatestBaileysVersion,\n makeCacheableSignalKeyStore,\n type MessageUpsertType,\n type UserFacingSocketConfig,\n type WAMessage,\n type WASocket,\n useMultiFileAuthState,\n type AuthenticationState,\n} from '@fadzzzslebew/baileys';\nimport type { 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';\n\nconst pinoLogger: any = P({ level: 'silent' });\n\nexport type WhatsappSocketBaseProps = (\n | { mongoURL: string; fileAuthStateDirectoryPath?: string }\n | { mongoURL?: string; fileAuthStateDirectoryPath: string }\n) & {\n logger?: any;\n mongoCollection?: string;\n onOpen?: () => Promise<void> | void;\n onClose?: () => Promise<void> | void;\n onConnectionStatusChange?: (connectionStatus: 'connecting' | 'close' | 'open') => Promise<void> | void;\n onReceiveMessages?: (messages: WAMessage[], type: MessageUpsertType) => Promise<void> | void;\n onQR?: (qr: string, code?: string | null) => Promise<void> | void;\n debug?: boolean;\n printQRInTerminal?: boolean;\n pairingPhone?: string;\n customPairingCode?: string;\n allowUseLastVersion?: boolean;\n};\n\nexport class WhatsappSocketBase {\n protected socket: null | WASocket;\n protected readonly fileAuthStateDirectoryPath?: string;\n protected readonly mongoURL?: string;\n protected readonly mongoCollection: string = 'whatsapp-auth';\n protected readonly logger?: MyLogger;\n protected readonly debug?: boolean;\n protected readonly printQRInTerminal?: boolean;\n protected readonly pairingPhone?: string;\n protected readonly customPairingCode?: string;\n protected readonly allowUseLastVersion?: boolean;\n private onOpen?: () => Promise<void> | void;\n private onClose?: () => Promise<void> | void;\n private onQR?: (qr: string, code?: string | null) => Promise<void> | void;\n private onConnectionStatusChange?: (connectionStatus: 'open' | 'close' | 'connecting') => Promise<void> | void;\n private readonly onReceiveMessages?: (messages: WAMessage[], type: MessageUpsertType) => Promise<void> | void;\n static DEFAULT_COUNTRY_CODE: string = '972';\n\n static formatPhoneNumber(phone: string, countryCode: string = WhatsappSocketBase.DEFAULT_COUNTRY_CODE): string {\n if (phone.endsWith('@s.whatsapp.net')) return phone;\n\n let strNumber = phone.replace(/[^0-9]/g, '');\n if (strNumber.startsWith('05')) strNumber = strNumber.substring(1);\n if (!strNumber.startsWith(countryCode)) strNumber = countryCode + strNumber;\n\n return strNumber; // formatted Number should look like: '+972 051-333-4444' to: '972513334444'\n }\n\n static formatPhoneNumberToWhatsappPattern(\n phone: string,\n countryCode: string = WhatsappSocketBase.DEFAULT_COUNTRY_CODE\n ): string {\n if (phone.endsWith('@s.whatsapp.net')) return phone;\n\n let strNumber = WhatsappSocketBase.formatPhoneNumber(phone, countryCode);\n strNumber = `${strNumber}@s.whatsapp.net`; // formatted Number should look like: '972513334444@s.whatsapp.net'\n return strNumber;\n }\n\n static getWhatsappPhoneLink({\n phone,\n message,\n countryCode = this.DEFAULT_COUNTRY_CODE,\n }: {\n phone: string;\n countryCode?: string;\n message?: string;\n }) {\n const formattedPhone = this.formatPhoneNumber(phone, countryCode);\n const query = { ...(message && { text: encodeURI(message) }) };\n return `https://wa.me/${formattedPhone}?${query}`;\n }\n\n static async qrToImage(\n qr: string,\n options: {\n errorCorrectionLevel?: 'H' | 'L' | 'M';\n width?: number;\n margin?: number;\n [key: string]: any;\n } = {}\n ) {\n return QRCode.toDataURL(qr, {\n errorCorrectionLevel: 'H', // Changed to 'H' (High) for better reliability\n width: 400, // Increased size for better scanning\n margin: 2, // Ensure adequate margin\n ...options,\n });\n }\n\n static async qrToTerminalString(\n qr: string,\n options: {\n small?: boolean;\n [key: string]: any;\n } = {}\n ) {\n return QRCode.toString(qr, { type: 'terminal', small: true, ...options });\n }\n\n // only 8 alphanumeric (no more or less), patterns [a-z0-8] | aaaa[0-8] xxzzvvcc [zaq0-8]\n static randomPairingCode(pattern: string, length = 8) {\n // no randomness needed\n if (!pattern.includes('[') && pattern.length === length) {\n return pattern;\n }\n\n let result = '';\n let pool: string[] = [];\n\n const buildPool = (block: string) => {\n const chars: string[] = [];\n\n for (let i = 0; i < block.length; i++) {\n if (block[i + 1] === '-' && block[i + 2]) {\n const start = block.charCodeAt(i);\n const end = block.charCodeAt(i + 2);\n\n for (let c = start; c <= end; c++) {\n chars.push(String.fromCharCode(c));\n }\n\n i += 2;\n } else {\n chars.push(block[i]);\n }\n }\n\n return chars;\n };\n\n for (let i = 0; i < pattern.length && result.length < length; i++) {\n const char = pattern[i];\n\n if (char === '[') {\n const end = pattern.indexOf(']', i);\n const block = pattern.slice(i + 1, end);\n\n pool = buildPool(block);\n i = end;\n } else {\n result += char;\n }\n }\n\n // fill remaining from pool\n while (result.length < length && pool.length) {\n result += pool[Math.floor(Math.random() * pool.length)];\n }\n\n const upperCaseResult = result.toUpperCase();\n return upperCaseResult.padEnd(length, upperCaseResult);\n }\n\n constructor({\n fileAuthStateDirectoryPath,\n mongoURL,\n mongoCollection = 'whatsapp-auth',\n logger,\n onOpen,\n onClose,\n onQR,\n onReceiveMessages,\n onConnectionStatusChange,\n debug,\n printQRInTerminal,\n pairingPhone,\n customPairingCode,\n allowUseLastVersion = true,\n }: WhatsappSocketBaseProps) {\n this.mongoURL = mongoURL;\n this.fileAuthStateDirectoryPath = fileAuthStateDirectoryPath;\n this.mongoCollection = mongoCollection;\n this.logger = logger;\n this.debug = debug;\n this.printQRInTerminal = printQRInTerminal;\n this.pairingPhone = pairingPhone;\n this.customPairingCode = customPairingCode;\n this.allowUseLastVersion = allowUseLastVersion;\n this.onConnectionStatusChange = onConnectionStatusChange;\n this.socket = null;\n this.onReceiveMessages = onReceiveMessages;\n this.onOpen = onOpen;\n this.onClose = onClose;\n this.onQR = onQR;\n }\n\n private async getAuthCollection(): Promise<[] | [Collection<MongoDocument>, MongoClient]> {\n if (!this.mongoURL) return [];\n\n const mongoClient = new MongoClient(this.mongoURL);\n await mongoClient.connect();\n const collection = mongoClient.db().collection(this.mongoCollection);\n\n return [collection, mongoClient];\n }\n\n private async authenticate(): Promise<{ auth: AuthenticationState; saveCreds: any }> {\n if (!this.mongoURL && !this.fileAuthStateDirectoryPath) {\n throw new Error('fileAuthStateDirectoryPath/MongoURL is missing');\n }\n if (!this.mongoURL) {\n const { saveCreds, state } = await useMultiFileAuthState(this.fileAuthStateDirectoryPath as string);\n return { auth: state, saveCreds };\n }\n\n const [collection] = await this.getAuthCollection();\n\n const { state, saveCreds } = await useMongoDBAuthState(collection);\n const auth = {\n creds: state.creds,\n keys: makeCacheableSignalKeyStore(state.keys, pinoLogger as any),\n } as AuthenticationState;\n\n return { auth, saveCreds };\n }\n\n async startConnection({\n options,\n connectionAttempts = 3,\n onOpen = this.onOpen,\n onClose = this.onClose,\n onQR = this.onQR,\n onConnectionStatusChange = this.onConnectionStatusChange,\n pairingPhone: _pairingPhone,\n debug: _debug,\n }: {\n options?: UserFacingSocketConfig;\n debug?: boolean;\n pairingPhone?: string;\n connectionAttempts?: number;\n onOpen?: () => Promise<void> | void;\n onClose?: () => Promise<void> | void;\n onQR?: (qr: string, code?: string | null) => Promise<void> | void;\n onConnectionStatusChange?: (status: 'open' | 'close' | 'connecting') => Promise<void> | void;\n } = {}): Promise<WASocket> {\n const pairingPhone = _pairingPhone ?? this.pairingPhone;\n const { saveCreds, auth } = await this.authenticate();\n const debug = _debug === undefined ? this.debug : _debug;\n\n // Fetch latest Baileys version for better compatibility\n const { version, isLatest } = await fetchLatestBaileysVersion();\n if (this.allowUseLastVersion && !isLatest) {\n if (debug)\n this.logger?.warn('WHATSAPP', 'current baileys service is not the latest version!', {\n version,\n isLatest,\n });\n }\n\n const connect = () => {\n const sock = makeWASocket({\n version: this.allowUseLastVersion ? version : [2, 3000, 1027934701],\n logger: pinoLogger,\n browser: ['Ubuntu', 'Chrome', '20.0.04'],\n syncFullHistory: false, // Don't sync full history on first connect\n shouldSyncHistoryMessage: () => false,\n shouldIgnoreJid: (jid) => jid.includes('@newsletter'), // Ignore newsletter\n ...options,\n printQRInTerminal: false,\n ...{ auth },\n });\n\n // CRITICAL: Handle connection updates properly\n sock.ev.on('connection.update', async (update) => {\n const { connection, lastDisconnect, qr } = update;\n\n if (qr) {\n if (debug) this.logger?.info('WHATSAPP', 'QR Code received', { qr });\n if (this.printQRInTerminal) {\n const qrcode = await WhatsappSocketBase.qrToTerminalString(qr, { small: true }).catch(\n () => null\n );\n console.log(qrcode);\n }\n\n // @ts-ignore\n const pair = this.customPairingCode\n ? WhatsappSocketBase.randomPairingCode(this.customPairingCode)\n : undefined;\n\n const pairing = pairingPhone ? WhatsappSocketBase.formatPhoneNumber(pairingPhone) : null;\n const code = pairing ? await sock.requestPairingCode(pairing) : null;\n\n if (debug && this.printQRInTerminal) {\n this.logger?.info('WHATSAPP', 'QR Pairing Code', { code, pairingPhone: pairing });\n }\n\n await onQR?.(qr, code);\n }\n\n switch (connection) {\n case 'connecting': {\n if (debug) this.logger?.debug('WHATSAPP', 'Connecting...');\n onConnectionStatusChange?.('connecting');\n break;\n }\n\n case 'open': {\n if (debug) this.logger?.info('WHATSAPP', 'Connection opened successfully!');\n this.socket = sock;\n await onOpen?.();\n onConnectionStatusChange?.('open');\n 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 setTimeout(connect, 1000);\n } else {\n if (debug) this.logger?.warn('WHATSAPP', 'Logged out, clearing auth state');\n await onClose?.();\n this.socket = null;\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 return sock;\n };\n\n return connect();\n }\n\n async closeConnection() {\n if (this.socket) {\n if (this.debug) this.logger?.info('WHATSAPP', 'Closing connection');\n this.socket.end(undefined);\n this.socket = null;\n }\n }\n\n async clearAuthState() {\n if (this.mongoURL) {\n const [collection, mongoClient] = await this.getAuthCollection();\n\n if (this.debug) this.logger?.info('WHATSAPP', 'Deleting auth state, required to scanning QR again');\n await collection?.deleteMany({});\n await mongoClient?.close();\n } else if (this.fileAuthStateDirectoryPath) {\n fs.rmSync(this.fileAuthStateDirectoryPath, { recursive: true, force: true });\n }\n }\n\n async resetConnection({ pairingPhone }: { pairingPhone?: string } = {}) {\n await this.closeConnection();\n await this.clearAuthState();\n // Wait a bit before reconnecting\n await new Promise((resolve) => setTimeout(resolve, 2000));\n await this.startConnection({ pairingPhone });\n }\n\n isConnected() {\n return this.socket !== null && this.socket.user !== undefined;\n }\n}\n","import 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","import { type MiscMessageGenerationOptions, generateWAMessageFromContent } from '@fadzzzslebew/baileys';\nimport { WAProto as proto } from '@fadzzzslebew/baileys';\nimport { WhatsappSocketBase, type WhatsappSocketBaseProps } from './whatsappSocket.base.ts';\nexport type { WhatsappSocketBaseProps as WhatsappSocketMessagesProps } from './whatsappSocket.base.ts';\nimport { type StringValue } from 'ms';\nimport { getTotalSeconds } from './helpers.ts';\n\ntype ButtonURL = { label: string; url: string };\ntype ButtonCopy = { label: string; copy: string };\ntype ButtonPhone = { label: string; tel: string };\ntype ButtonEmail = { label: string; email: string };\ntype ButtonReminder = { label: string; reminderName: string } & (\n | { reminderOn?: StringValue; reminderDate: number }\n | { reminderOn: StringValue; reminderDate?: number | Date | string }\n);\n\ntype ButtonParamsJson = {\n display_text: string;\n url?: string;\n copy_code?: string;\n phone_number?: string;\n email?: string;\n reminder_name?: string;\n reminder_timestamp?: number;\n};\n\ntype CallToActionButtons = Array<\n ButtonURL | ButtonCopy | ButtonPhone\n // ButtonEmail | ButtonReminder // not supported\n>;\n\ntype CallToActionFullButtons = Array<ButtonURL | ButtonCopy | ButtonPhone | ButtonEmail | ButtonReminder>;\n\nexport class WhatsappSocketMessages extends WhatsappSocketBase {\n static DEFAULT_COUNTRY_CODE: string = '972';\n\n constructor(props: WhatsappSocketBaseProps) {\n super(props);\n }\n\n async sendTextMessage(to: string, text: string, replyToMessageId?: string): Promise<any> {\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketMessages.formatPhoneNumberToWhatsappPattern(to);\n const options: MiscMessageGenerationOptions = {\n ...(replyToMessageId && { quoted: { key: { id: replyToMessageId } } }),\n };\n\n return this.socket.sendMessage(jid, { text }, options);\n }\n\n async sendButtonsMessage(\n to: string,\n { subtitle, title, buttons }: { title: string; subtitle?: string; buttons: CallToActionButtons }\n ): Promise<any> {\n if (!title || !buttons.length) {\n throw new Error('sendButtonsMessage: No title or buttons required field found.');\n }\n\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketMessages.formatPhoneNumberToWhatsappPattern(to);\n\n const buttonsValue = (buttons as CallToActionFullButtons)\n ?.map((btn) => {\n const buttonParamsJson: ButtonParamsJson = { display_text: btn.label };\n\n let name: string;\n switch (true) {\n case !!(btn as ButtonURL).url:\n name = 'cta_url';\n buttonParamsJson.url = (btn as ButtonURL).url;\n break;\n case !!(btn as ButtonCopy).copy:\n name = 'cta_copy';\n buttonParamsJson.copy_code = (btn as ButtonCopy).copy;\n break;\n case !!(btn as ButtonPhone).tel:\n name = 'cta_call';\n buttonParamsJson.phone_number = (btn as ButtonPhone).tel;\n break;\n case !!(btn as ButtonEmail).email:\n name = 'cta_email';\n buttonParamsJson.email = (btn as ButtonEmail).email;\n break;\n case !!((btn as ButtonReminder).reminderOn || (btn as ButtonReminder).reminderDate):\n name = 'cta_reminder';\n const { reminderOn, reminderDate } = btn as ButtonReminder;\n buttonParamsJson.reminder_name = (btn as ButtonReminder).reminderName;\n buttonParamsJson.reminder_timestamp = reminderDate\n ? Math.floor(+new Date(reminderDate) / 1000)\n : Math.floor(Date.now() / 1000) + getTotalSeconds(reminderOn ?? '0s');\n break;\n default:\n name = '';\n break;\n }\n\n return { name, buttonParamsJson: JSON.stringify(buttonParamsJson) };\n })\n .filter((v) => v.name);\n\n const msg = generateWAMessageFromContent(\n jid,\n {\n viewOnceMessage: {\n message: {\n interactiveMessage: proto.Message.InteractiveMessage.create({\n ...(title && {\n body: proto.Message.InteractiveMessage.Body.create({ text: title }),\n }),\n ...(subtitle && {\n footer: proto.Message.InteractiveMessage.Footer.create({ text: subtitle }),\n }),\n ...(!!buttonsValue?.length && {\n nativeFlowMessage: proto.Message.InteractiveMessage.NativeFlowMessage.create({\n buttons: buttonsValue,\n }),\n }),\n }),\n },\n },\n },\n { userJid: jid }\n );\n\n return this.socket.relayMessage(jid, msg.message!, { messageId: msg.key.id! });\n }\n\n async sendReplyButtonsMessage(\n to: string,\n {\n title,\n subtitle,\n buttons,\n }: {\n title: string;\n subtitle?: string;\n buttons: string[];\n }\n ): Promise<any> {\n if (!title || !buttons.length) {\n throw new Error('sendReplyButtonsMessage: No title or buttons required field found.');\n }\n\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketMessages.formatPhoneNumberToWhatsappPattern(to);\n\n return this.socket.sendMessage(jid, {\n text: title,\n ...(subtitle && { footer: subtitle }),\n buttons: buttons\n .filter((v) => v)\n .map((displayText, index) => ({ buttonId: `id${index}`, buttonText: { displayText }, type: 1 })),\n /* type: UNKNOWN = 0, RESPONSE = 1, NATIVE_FLOW = 2 */\n });\n }\n}\n","import { type AnyMessageContent } from '@fadzzzslebew/baileys';\nimport { Readable } from 'stream';\nimport { WhatsappSocketMessages, type WhatsappSocketMessagesProps } from './whatsappSocket.messages.ts';\nexport { type WhatsappSocketMessagesProps as WhatsappSocketStreamProps } from './whatsappSocket.messages';\n\nexport class WhatsappSocketStream extends WhatsappSocketMessages {\n static DEFAULT_COUNTRY_CODE: string = '972';\n\n constructor(props: WhatsappSocketMessagesProps) {\n super(props);\n }\n\n protected async sendFileFromStream(\n to: string,\n stream: Readable | Buffer,\n options: {\n filename: string;\n mimetype?: string;\n caption?: string;\n replyToMessageId?: string;\n // File type specific options\n ptt?: boolean; // Push to talk (voice note)\n seconds?: number; // Duration for audio/video\n gifPlayback?: boolean; // For GIF videos\n // Additional options\n jpegThumbnail?: Buffer | string; // Thumbnail for videos/documents\n }\n ): Promise<any> {\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketStream.formatPhoneNumberToWhatsappPattern(to);\n\n // Convert stream to buffer if needed\n const buffer = stream instanceof Buffer ? stream : await this.streamToBuffer(stream as Readable);\n\n // Auto-detect mimetype if not provided\n const mimetype = options.mimetype || this.getMimetypeFromFilename(options.filename);\n\n // Determine message type based on mimetype\n const messageContent = await this.createFileMessage(buffer, mimetype, options);\n\n const messageOptions: any = {\n ...(options.replyToMessageId && {\n quoted: { key: { id: options.replyToMessageId } },\n }),\n };\n\n return this.socket.sendMessage(jid, messageContent, messageOptions);\n }\n\n private async streamToBuffer(stream: Readable): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n stream.on('data', (chunk) => chunks.push(Buffer.from(chunk)));\n stream.on('error', (err) => reject(err));\n stream.on('end', () => resolve(Buffer.concat(chunks)));\n });\n }\n\n private getMimetypeFromFilename(filename: string): string {\n const ext = filename.split('.').pop()?.toLowerCase();\n\n const mimetypes: { [key: string]: string } = {\n // Images\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n png: 'image/png',\n gif: 'image/gif',\n webp: 'image/webp',\n bmp: 'image/bmp',\n svg: 'image/svg+xml',\n\n // Videos\n mp4: 'video/mp4',\n avi: 'video/x-msvideo',\n mov: 'video/quicktime',\n mkv: 'video/x-matroska',\n webm: 'video/webm',\n\n // Audio\n mp3: 'audio/mpeg',\n wav: 'audio/wav',\n ogg: 'audio/ogg',\n opus: 'audio/opus',\n aac: 'audio/aac',\n m4a: 'audio/mp4',\n\n // Documents\n pdf: 'application/pdf',\n doc: 'application/msword',\n docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n xls: 'application/vnd.ms-excel',\n xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n ppt: 'application/vnd.ms-powerpoint',\n pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n txt: 'text/plain',\n zip: 'application/zip',\n rar: 'application/x-rar-compressed',\n '7z': 'application/x-7z-compressed',\n };\n\n return mimetypes[ext || ''] || 'application/octet-stream';\n }\n\n private async createFileMessage(\n buffer: Buffer,\n mimetype: string,\n options: {\n filename: string;\n caption?: string;\n ptt?: boolean;\n seconds?: number;\n gifPlayback?: boolean;\n jpegThumbnail?: Buffer | string;\n }\n ): Promise<AnyMessageContent> {\n const [type] = mimetype.split('/');\n\n switch (type) {\n case 'image':\n return {\n image: buffer,\n caption: options.caption,\n mimetype,\n fileName: options.filename,\n };\n\n case 'video':\n return {\n video: buffer,\n caption: options.caption,\n mimetype,\n fileName: options.filename,\n gifPlayback: options.gifPlayback || false,\n jpegThumbnail: options.jpegThumbnail as string,\n ...(options.seconds && { seconds: options.seconds }),\n };\n\n case 'audio':\n if (options.ptt) {\n // Voice note\n return {\n audio: buffer,\n mimetype: 'audio/ogg; codecs=opus',\n ptt: true,\n ...(options.seconds && { seconds: options.seconds }),\n };\n }\n return {\n audio: buffer,\n mimetype,\n fileName: options.filename,\n ...(options.seconds && { seconds: options.seconds }),\n };\n\n default:\n // Document (PDF, DOC, etc.)\n return {\n document: buffer,\n mimetype,\n fileName: options.filename,\n caption: options.caption,\n jpegThumbnail: options.jpegThumbnail as string,\n };\n }\n }\n\n // Helper method to send specific file types\n protected async sendImage(\n to: string,\n imageBuffer: Buffer | Readable,\n options: {\n caption?: string;\n filename?: string;\n replyToMessageId?: string;\n } = {}\n ): Promise<any> {\n return this.sendFileFromStream(to, imageBuffer, {\n filename: options.filename || 'image.jpg',\n mimetype: 'image/jpeg',\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 mimetype: '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' : 'audio/mpeg',\n ptt: options.ptt,\n seconds: options.seconds,\n replyToMessageId: options.replyToMessageId,\n });\n }\n\n protected async sendDocument(\n to: string,\n documentBuffer: Buffer | Readable,\n options: {\n filename: string;\n caption?: string;\n mimetype?: string;\n replyToMessageId?: string;\n jpegThumbnail?: Buffer;\n }\n ): Promise<any> {\n return this.sendFileFromStream(to, documentBuffer, {\n filename: options.filename,\n mimetype: options.mimetype,\n caption: options.caption,\n replyToMessageId: options.replyToMessageId,\n jpegThumbnail: options.jpegThumbnail,\n });\n }\n\n protected async sendVoiceNote(\n to: string,\n audioBuffer: Buffer | Readable,\n options: {\n seconds?: number;\n replyToMessageId?: string;\n } = {}\n ): Promise<any> {\n return this.sendAudio(to, audioBuffer, {\n ptt: true,\n seconds: options.seconds,\n replyToMessageId: options.replyToMessageId,\n });\n }\n\n protected async sendSticker(\n to: string,\n stickerBuffer: Buffer | Readable,\n options: {\n replyToMessageId?: string;\n } = {}\n ): Promise<any> {\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketStream.formatPhoneNumberToWhatsappPattern(to);\n const buffer =\n stickerBuffer instanceof Buffer ? stickerBuffer : await this.streamToBuffer(stickerBuffer as Readable);\n\n const messageOptions: any = {\n ...(options.replyToMessageId && {\n quoted: { key: { id: options.replyToMessageId } },\n }),\n };\n\n return this.socket.sendMessage(jid, { sticker: buffer }, messageOptions);\n }\n}\n","import { ReadStream } from 'node:fs';\n\nimport { WhatsappSocketStream, type WhatsappSocketStreamProps } from './whatsappSocket.stream';\nexport { type WhatsappSocketStreamProps as WhatsappSocketFilesProps } from './whatsappSocket.stream';\nimport { getAudioFileDuration, getFilenameFromStream, getUrlBuffer, streamToBuffer } from './helpers.ts';\nimport { basename } from 'node:path';\n\nexport class WhatsappSocketFiles extends WhatsappSocketStream {\n static DEFAULT_COUNTRY_CODE: string = '972';\n\n constructor(props: WhatsappSocketStreamProps) {\n super(props);\n }\n\n async sendImageMessage(\n to: string,\n imageSrc: string | Buffer<any> | ReadStream,\n { caption = '', filename }: { caption?: string; filename?: string } = {}\n ) {\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketFiles.formatPhoneNumberToWhatsappPattern(to);\n const imageData = typeof imageSrc === 'string' ? await getUrlBuffer(imageSrc) : imageSrc;\n\n return await super.sendImage(jid, imageData, { caption, ...(filename && { filename }) });\n }\n\n async sendVideoMessage(\n to: string,\n videoSrc: string | Buffer<any> | ReadStream,\n {\n caption = '',\n filename,\n sendAsGifPlayback: gifPlayback = false,\n }: { caption?: string; sendAsGifPlayback?: boolean; filename?: string } = {}\n ) {\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketFiles.formatPhoneNumberToWhatsappPattern(to);\n const videoBuffer = typeof videoSrc === 'string' ? await getUrlBuffer(videoSrc) : videoSrc;\n\n return await super.sendVideo(jid, videoBuffer, { caption, gifPlayback, ...(filename && { filename }) });\n }\n\n async sendFileMessage(\n to: string,\n fileSrc: string | Buffer<any> | ReadStream,\n {\n caption = '',\n mimetype = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n replyToMessageId,\n jpegThumbnailSrc,\n filename: _filename,\n }: {\n caption?: string;\n mimetype?: string;\n filename?: string;\n replyToMessageId?: string;\n jpegThumbnailSrc?: string | Buffer<any> | ReadStream;\n } = {}\n ) {\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketFiles.formatPhoneNumberToWhatsappPattern(to);\n const fileBuffer = typeof fileSrc === 'string' ? await getUrlBuffer(fileSrc) : fileSrc;\n\n let jpegThumbnailBuffer: Buffer<any> | undefined;\n if (typeof jpegThumbnailSrc === 'string') {\n jpegThumbnailBuffer = await getUrlBuffer(jpegThumbnailSrc);\n } else if (jpegThumbnailSrc instanceof ReadStream) {\n jpegThumbnailBuffer = await streamToBuffer(jpegThumbnailSrc);\n } else {\n jpegThumbnailBuffer = jpegThumbnailSrc;\n }\n\n let filename = 'mu-document';\n if (fileSrc instanceof ReadStream) {\n const fname = getFilenameFromStream(fileSrc);\n if (fname) filename = fname;\n } else if (typeof fileSrc === 'string') {\n filename = basename(fileSrc);\n }\n\n return await super.sendDocument(jid, fileBuffer, {\n caption,\n mimetype,\n filename,\n replyToMessageId,\n jpegThumbnail: jpegThumbnailBuffer,\n });\n }\n\n async sendAudioMessage(\n to: string,\n audioSrc: string | Buffer<any> | ReadStream,\n {\n filename,\n replyToMessageId,\n mimetype,\n seconds,\n }: { filename?: string; replyToMessageId?: string; mimetype?: string; seconds?: number } = {}\n ) {\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketFiles.formatPhoneNumberToWhatsappPattern(to);\n const audioBuffer = typeof audioSrc === 'string' ? await getUrlBuffer(audioSrc) : audioSrc;\n let durationInSeconds = seconds || (await getAudioFileDuration(audioBuffer, mimetype).catch(() => 0));\n\n return await super.sendAudio(jid, audioBuffer, {\n ...(filename && { filename }),\n ...(mimetype && { mimetype: mimetype }),\n ...(durationInSeconds && { seconds: durationInSeconds }),\n ...(replyToMessageId && { replyToMessageId: replyToMessageId }),\n });\n }\n\n /**\n * requirements:\n * * format .webp\n * * imageSize 512pxx512px\n * * maxSize: 100kb\n * * transparent background\n * @param to\n * @param imageSrc\n * @param replyToMessageId\n */\n async sendStickerMessage(\n to: string,\n imageSrc: string | Buffer<any> | ReadStream,\n { replyToMessageId }: { replyToMessageId?: string } = {}\n ) {\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketFiles.formatPhoneNumberToWhatsappPattern(to);\n const stickerBuffer = typeof imageSrc === 'string' ? await getUrlBuffer(imageSrc) : imageSrc;\n\n await super.sendSticker(jid, stickerBuffer, { replyToMessageId });\n }\n}\n","import { WhatsappSocketFiles, type WhatsappSocketFilesProps } from './whatsappSocket.files';\n\nexport class WhatsappSocket extends WhatsappSocketFiles {\n constructor(props: WhatsappSocketFilesProps) {\n super(props);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/mongoAuthState.ts","../src/whatsappSocket.base.ts","../src/helpers.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","pinoLogger","P","WhatsappSocketBase","_WhatsappSocketBase","phone","countryCode","strNumber","message","formattedPhone","query","qr","options","QRCode","pattern","length","result","pool","buildPool","block","chars","i","start","end","c","char","upperCaseResult","fileAuthStateDirectoryPath","mongoURL","mongoCollection","logger","onOpen","onClose","onQR","onReceiveMessages","onConnectionStatusChange","debug","printQRInTerminal","pairingPhone","customPairingCode","allowUseLastVersion","mongoClient","MongoClient","saveCreds","state","useMultiFileAuthState","makeCacheableSignalKeyStore","connectionAttempts","_pairingPhone","_debug","auth","version","isLatest","fetchLatestBaileysVersion","connect","sock","makeWASocket","jid","connection","lastDisconnect","qrcode","pairing","code","shouldReconnect","DisconnectReason","statusCode","errorMessage","messages","fs","resolve","getTotalSeconds","msValue","ms","getUrlBuffer","url","arrayBuffer","getDurationFromStream","stream","mimeType","metadata","parseStream","error","getDurationFromBuffer","buffer","parseBuffer","getAudioFileDuration","audioFile","ReadStream","streamToBuffer","chunks","chunk","getFilenameFromStream","pathStr","basename","WhatsappSocketMessages","_WhatsappSocketMessages","props","to","text","replyToMessageId","subtitle","title","buttons","buttonsValue","btn","buttonParamsJson","name","reminderOn","reminderDate","v","msg","generateWAMessageFromContent","displayText","index","WhatsappSocketStream","_WhatsappSocketStream","mimetype","messageContent","messageOptions","reject","err","filename","ext","imageBuffer","videoBuffer","audioBuffer","documentBuffer","stickerBuffer","WhatsappSocketFiles","_WhatsappSocketFiles","imageSrc","caption","imageData","videoSrc","gifPlayback","fileSrc","jpegThumbnailSrc","_filename","fileBuffer","jpegThumbnailBuffer","fname","audioSrc","seconds","durationInSeconds","WhatsappSocket"],"mappings":"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","file":"index.js","sourcesContent":["import {\n type AuthenticationCreds,\n type SignalDataTypeMap,\n initAuthCreds,\n WAProto as proto,\n} from '@fadzzzslebew/baileys';\n\nconst BufferJSON = {\n replacer: (_k: string, value: any) => {\n if (Buffer.isBuffer(value) || value instanceof Uint8Array || value?.type === 'Buffer') {\n return {\n type: 'Buffer',\n data: Buffer.from(value?.data || value).toString('base64'),\n };\n }\n return value;\n },\n\n reviver: (_: string, value: any) => {\n if (typeof value === 'object' && !!value && (value.buffer === true || value.type === 'Buffer')) {\n const val = value.data || value.value;\n return typeof val === 'string' ? Buffer.from(val, 'base64') : Buffer.from(val || []);\n }\n return value;\n },\n};\n\nconst useMongoDBAuthState = async (collection: any) => {\n const writeData = (data: any, id: string) => {\n const informationToStore = JSON.parse(JSON.stringify(data, BufferJSON.replacer));\n const update = { $set: { ...informationToStore } };\n return collection.updateOne({ _id: id }, update, { upsert: true });\n };\n\n const readData = async (id: string) => {\n try {\n const data = JSON.stringify(await collection.findOne({ _id: id }));\n return JSON.parse(data, BufferJSON.reviver);\n } catch (error) {\n return null;\n }\n };\n\n const removeData = async (id: string) => {\n try {\n await collection.deleteOne({ _id: id });\n } catch (_a) {}\n };\n\n const creds: AuthenticationCreds = (await readData('creds')) || initAuthCreds();\n\n return {\n state: {\n creds,\n keys: {\n get: async (type: keyof SignalDataTypeMap, ids: string[]) => {\n const data: { [id: string]: any } = {};\n await Promise.all(\n ids.map(async (id) => {\n let value = await readData(`${type}-${id}`);\n if (type === 'app-state-sync-key' && value) {\n value = proto.Message.AppStateSyncKeyData.fromObject(value);\n }\n data[id] = value;\n })\n );\n return data;\n },\n set: async (data: any) => {\n const tasks: Promise<any>[] = [];\n for (const category of Object.keys(data)) {\n for (const id of Object.keys(data[category])) {\n const value = data[category][id];\n const key = `${category}-${id}`;\n tasks.push(value ? writeData(value, key) : removeData(key));\n }\n }\n await Promise.all(tasks);\n },\n },\n },\n saveCreds: () => {\n return writeData(creds, 'creds');\n },\n };\n};\n\nexport default useMongoDBAuthState;\n","// Baileys links\n// https://whiskeysockets.github.io/docs/tutorial-basics/sending-messages\n// https://github.com/WhiskeySockets/Baileys\n// https://github.com/ndalu-id/baileys-api\n// https://whiskeysockets.github.io/Baileys/\n// alternatives:\n// https://www.npmjs.com/package/mudslide\n// https://www.npmjs.com/package/whatsapp-web.js\n// https://www.npmjs.com/package/wbm\nimport {\n default as makeWASocket,\n DisconnectReason,\n fetchLatestBaileysVersion,\n makeCacheableSignalKeyStore,\n type MessageUpsertType,\n type UserFacingSocketConfig,\n type WAMessage,\n type WASocket,\n useMultiFileAuthState,\n type AuthenticationState,\n} from '@fadzzzslebew/baileys';\nimport type { 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';\n\nconst pinoLogger: any = P({ level: 'silent' });\n\nexport type WhatsappSocketBaseProps = (\n | { mongoURL: string; fileAuthStateDirectoryPath?: string }\n | { mongoURL?: string; fileAuthStateDirectoryPath: string }\n) & {\n logger?: any;\n mongoCollection?: string;\n onOpen?: () => Promise<void> | void;\n onClose?: () => Promise<void> | void;\n onConnectionStatusChange?: (connectionStatus: 'connecting' | 'close' | 'open') => Promise<void> | void;\n onReceiveMessages?: (messages: WAMessage[], type: MessageUpsertType) => Promise<void> | void;\n onQR?: (qr: string, code?: string | null) => Promise<void> | void;\n debug?: boolean;\n printQRInTerminal?: boolean;\n pairingPhone?: string;\n customPairingCode?: string;\n allowUseLastVersion?: boolean;\n};\n\nexport class WhatsappSocketBase {\n protected socket: null | WASocket;\n protected readonly fileAuthStateDirectoryPath?: string;\n protected readonly mongoURL?: string;\n protected readonly mongoCollection: string = 'whatsapp-auth';\n protected readonly logger?: MyLogger;\n protected readonly debug?: boolean;\n protected readonly printQRInTerminal?: boolean;\n protected readonly pairingPhone?: string;\n protected readonly customPairingCode?: string;\n protected readonly allowUseLastVersion?: boolean;\n private onOpen?: () => Promise<void> | void;\n private onClose?: () => Promise<void> | void;\n private onQR?: (qr: string, code?: string | null) => Promise<void> | void;\n private onConnectionStatusChange?: (connectionStatus: 'open' | 'close' | 'connecting') => Promise<void> | void;\n private readonly onReceiveMessages?: (messages: WAMessage[], type: MessageUpsertType) => Promise<void> | void;\n static DEFAULT_COUNTRY_CODE: string = '972';\n\n static formatPhoneNumber(phone: string, countryCode: string = WhatsappSocketBase.DEFAULT_COUNTRY_CODE): string {\n if (phone.endsWith('@s.whatsapp.net')) return phone;\n\n let strNumber = phone.replace(/[^0-9]/g, '');\n if (strNumber.startsWith('05')) strNumber = strNumber.substring(1);\n if (!strNumber.startsWith(countryCode)) strNumber = countryCode + strNumber;\n\n return strNumber; // formatted Number should look like: '+972 051-333-4444' to: '972513334444'\n }\n\n static formatPhoneNumberToWhatsappPattern(\n phone: string,\n countryCode: string = WhatsappSocketBase.DEFAULT_COUNTRY_CODE\n ): string {\n if (phone.endsWith('@s.whatsapp.net')) return phone;\n\n let strNumber = WhatsappSocketBase.formatPhoneNumber(phone, countryCode);\n strNumber = `${strNumber}@s.whatsapp.net`; // formatted Number should look like: '972513334444@s.whatsapp.net'\n return strNumber;\n }\n\n static getWhatsappPhoneLink({\n phone,\n message,\n countryCode = this.DEFAULT_COUNTRY_CODE,\n }: {\n phone: string;\n countryCode?: string;\n message?: string;\n }) {\n const formattedPhone = this.formatPhoneNumber(phone, countryCode);\n const query = { ...(message && { text: encodeURI(message) }) };\n return `https://wa.me/${formattedPhone}?${query}`;\n }\n\n static async qrToImage(\n qr: string,\n options: {\n errorCorrectionLevel?: 'H' | 'L' | 'M';\n width?: number;\n margin?: number;\n [key: string]: any;\n } = {}\n ) {\n return QRCode.toDataURL(qr, {\n errorCorrectionLevel: 'H', // Changed to 'H' (High) for better reliability\n width: 400, // Increased size for better scanning\n margin: 2, // Ensure adequate margin\n ...options,\n });\n }\n\n static async qrToTerminalString(\n qr: string,\n options: {\n small?: boolean;\n [key: string]: any;\n } = {}\n ) {\n return QRCode.toString(qr, { type: 'terminal', small: true, ...options });\n }\n\n // only 8 alphanumeric (no more or less), patterns [a-z0-8] | aaaa[0-8] xxzzvvcc [zaq0-8]\n static randomPairingCode(pattern: string, length = 8) {\n // no randomness needed\n if (!pattern.includes('[') && pattern.length === length) {\n return pattern;\n }\n\n let result = '';\n let pool: string[] = [];\n\n const buildPool = (block: string) => {\n const chars: string[] = [];\n\n for (let i = 0; i < block.length; i++) {\n if (block[i + 1] === '-' && block[i + 2]) {\n const start = block.charCodeAt(i);\n const end = block.charCodeAt(i + 2);\n\n for (let c = start; c <= end; c++) {\n chars.push(String.fromCharCode(c));\n }\n\n i += 2;\n } else {\n chars.push(block[i]);\n }\n }\n\n return chars;\n };\n\n for (let i = 0; i < pattern.length && result.length < length; i++) {\n const char = pattern[i];\n\n if (char === '[') {\n const end = pattern.indexOf(']', i);\n const block = pattern.slice(i + 1, end);\n\n pool = buildPool(block);\n i = end;\n } else {\n result += char;\n }\n }\n\n // fill remaining from pool\n while (result.length < length && pool.length) {\n result += pool[Math.floor(Math.random() * pool.length)];\n }\n\n const upperCaseResult = result.toUpperCase();\n return upperCaseResult.padEnd(length, upperCaseResult);\n }\n\n constructor({\n fileAuthStateDirectoryPath,\n mongoURL,\n mongoCollection = 'whatsapp-auth',\n logger,\n onOpen,\n onClose,\n onQR,\n onReceiveMessages,\n onConnectionStatusChange,\n debug,\n printQRInTerminal,\n pairingPhone,\n customPairingCode,\n allowUseLastVersion = true,\n }: WhatsappSocketBaseProps) {\n this.mongoURL = mongoURL;\n this.fileAuthStateDirectoryPath = fileAuthStateDirectoryPath;\n this.mongoCollection = mongoCollection;\n this.logger = logger;\n this.debug = debug;\n this.printQRInTerminal = printQRInTerminal;\n this.pairingPhone = pairingPhone;\n this.customPairingCode = customPairingCode;\n this.allowUseLastVersion = allowUseLastVersion;\n this.onConnectionStatusChange = onConnectionStatusChange;\n this.socket = null;\n this.onReceiveMessages = onReceiveMessages;\n this.onOpen = onOpen;\n this.onClose = onClose;\n this.onQR = onQR;\n }\n\n private async getAuthCollection(): Promise<[] | [Collection<MongoDocument>, MongoClient]> {\n if (!this.mongoURL) return [];\n\n const mongoClient = new MongoClient(this.mongoURL);\n await mongoClient.connect();\n const collection = mongoClient.db().collection(this.mongoCollection);\n\n return [collection, mongoClient];\n }\n\n private async authenticate(): Promise<{ auth: AuthenticationState; saveCreds: any }> {\n if (!this.mongoURL && !this.fileAuthStateDirectoryPath) {\n throw new Error('fileAuthStateDirectoryPath/MongoURL is missing');\n }\n if (!this.mongoURL) {\n const { saveCreds, state } = await useMultiFileAuthState(this.fileAuthStateDirectoryPath as string);\n return { auth: state, saveCreds };\n }\n\n const [collection] = await this.getAuthCollection();\n\n const { state, saveCreds } = await useMongoDBAuthState(collection);\n const auth = {\n creds: state.creds,\n keys: makeCacheableSignalKeyStore(state.keys, pinoLogger as any),\n } as AuthenticationState;\n\n return { auth, saveCreds };\n }\n\n async startConnection({\n options,\n connectionAttempts = 3,\n onOpen = this.onOpen,\n onClose = this.onClose,\n onQR = this.onQR,\n onConnectionStatusChange = this.onConnectionStatusChange,\n pairingPhone: _pairingPhone,\n debug: _debug,\n }: {\n options?: UserFacingSocketConfig;\n debug?: boolean;\n pairingPhone?: string;\n connectionAttempts?: number;\n onOpen?: () => Promise<void> | void;\n onClose?: () => Promise<void> | void;\n onQR?: (qr: string, code?: string | null) => Promise<void> | void;\n onConnectionStatusChange?: (status: 'open' | 'close' | 'connecting') => Promise<void> | void;\n } = {}): Promise<WASocket> {\n const pairingPhone = _pairingPhone ?? this.pairingPhone;\n const { saveCreds, auth } = await this.authenticate();\n const debug = _debug === undefined ? this.debug : _debug;\n\n // Fetch latest Baileys version for better compatibility\n const { version, isLatest } = await fetchLatestBaileysVersion();\n if (this.allowUseLastVersion && !isLatest) {\n if (debug)\n this.logger?.warn('WHATSAPP', 'current baileys service is not the latest version!', {\n version,\n isLatest,\n });\n }\n\n const connect = () => {\n const sock = makeWASocket({\n version: this.allowUseLastVersion ? version : [2, 3000, 1027934701],\n logger: pinoLogger,\n browser: ['Ubuntu', 'Chrome', '20.0.04'],\n syncFullHistory: false, // Don't sync full history on first connect\n shouldSyncHistoryMessage: () => false,\n shouldIgnoreJid: (jid) => jid.includes('@newsletter'), // Ignore newsletter\n ...options,\n printQRInTerminal: false,\n ...{ auth },\n });\n\n // CRITICAL: Handle connection updates properly\n sock.ev.on('connection.update', async (update) => {\n const { connection, lastDisconnect, qr } = update;\n\n if (qr) {\n if (debug) this.logger?.info('WHATSAPP', 'QR Code received', { qr });\n if (this.printQRInTerminal) {\n const qrcode = await WhatsappSocketBase.qrToTerminalString(qr, { small: true }).catch(\n () => null\n );\n console.log(qrcode);\n }\n\n // @ts-ignore\n const pair = this.customPairingCode\n ? WhatsappSocketBase.randomPairingCode(this.customPairingCode)\n : undefined;\n\n const pairing = pairingPhone ? WhatsappSocketBase.formatPhoneNumber(pairingPhone) : null;\n const code = pairing ? await sock.requestPairingCode(pairing) : null;\n\n if (debug && this.printQRInTerminal) {\n this.logger?.info('WHATSAPP', 'QR Pairing Code', { code, pairingPhone: pairing });\n }\n\n await onQR?.(qr, code);\n }\n\n switch (connection) {\n case 'connecting': {\n if (debug) this.logger?.debug('WHATSAPP', 'Connecting...');\n onConnectionStatusChange?.('connecting');\n break;\n }\n\n case 'open': {\n if (debug) this.logger?.info('WHATSAPP', 'Connection opened successfully!');\n this.socket = sock;\n await onOpen?.();\n onConnectionStatusChange?.('open');\n 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 setTimeout(connect, 1000);\n } else {\n if (debug) this.logger?.warn('WHATSAPP', 'Logged out, clearing auth state');\n await onClose?.();\n this.socket = null;\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 return sock;\n };\n\n return connect();\n }\n\n async closeConnection() {\n if (this.socket) {\n if (this.debug) this.logger?.info('WHATSAPP', 'Closing connection');\n this.socket.end(undefined);\n this.socket = null;\n }\n }\n\n async clearAuthState() {\n if (this.mongoURL) {\n const [collection, mongoClient] = await this.getAuthCollection();\n\n if (this.debug) this.logger?.info('WHATSAPP', 'Deleting auth state, required to scanning QR again');\n await collection?.deleteMany({});\n await mongoClient?.close();\n } else if (this.fileAuthStateDirectoryPath) {\n fs.rmSync(this.fileAuthStateDirectoryPath, { recursive: true, force: true });\n }\n }\n\n async resetConnection({ pairingPhone }: { pairingPhone?: string } = {}) {\n await this.closeConnection();\n await this.clearAuthState();\n // Wait a bit before reconnecting\n await new Promise((resolve) => setTimeout(resolve, 2000));\n await this.startConnection({ pairingPhone });\n }\n\n isConnected() {\n return this.socket !== null && this.socket.user !== undefined;\n }\n}\n","import 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","import { type MiscMessageGenerationOptions, generateWAMessageFromContent } from '@fadzzzslebew/baileys';\nimport { WAProto as proto } from '@fadzzzslebew/baileys';\nimport { WhatsappSocketBase, type WhatsappSocketBaseProps } from './whatsappSocket.base.ts';\nexport type { WhatsappSocketBaseProps as WhatsappSocketMessagesProps } from './whatsappSocket.base.ts';\nimport { type StringValue } from 'ms';\nimport { getTotalSeconds } from './helpers.ts';\n\ntype ButtonURL = { label: string; url: string };\ntype ButtonCopy = { label: string; copy: string };\ntype ButtonPhone = { label: string; tel: string };\ntype ButtonEmail = { label: string; email: string };\ntype ButtonReminder = { label: string; reminderName: string } & (\n | { reminderOn?: StringValue; reminderDate: number }\n | { reminderOn: StringValue; reminderDate?: number | Date | string }\n);\n\ntype ButtonParamsJson = {\n display_text: string;\n url?: string;\n copy_code?: string;\n phone_number?: string;\n email?: string;\n reminder_name?: string;\n reminder_timestamp?: number;\n};\n\ntype CallToActionButtons = Array<\n ButtonURL | ButtonCopy | ButtonPhone\n // ButtonEmail | ButtonReminder // not supported\n>;\n\ntype CallToActionFullButtons = Array<ButtonURL | ButtonCopy | ButtonPhone | ButtonEmail | ButtonReminder>;\n\nexport class WhatsappSocketMessages extends WhatsappSocketBase {\n static DEFAULT_COUNTRY_CODE: string = '972';\n\n constructor(props: WhatsappSocketBaseProps) {\n super(props);\n }\n\n async sendTextMessage(to: string, text: string, replyToMessageId?: string): Promise<any> {\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketMessages.formatPhoneNumberToWhatsappPattern(to);\n const options: MiscMessageGenerationOptions = {\n ...(replyToMessageId && { quoted: { key: { id: replyToMessageId } } }),\n };\n\n return this.socket.sendMessage(jid, { text }, options);\n }\n\n async sendButtonsMessage(\n to: string,\n { subtitle, title, buttons }: { title: string; subtitle?: string; buttons: CallToActionButtons }\n ): Promise<any> {\n if (!title || !buttons.length) {\n throw new Error('sendButtonsMessage: No title or buttons required field found.');\n }\n\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketMessages.formatPhoneNumberToWhatsappPattern(to);\n\n const buttonsValue = (buttons as CallToActionFullButtons)\n ?.map((btn) => {\n const buttonParamsJson: ButtonParamsJson = { display_text: btn.label };\n\n let name: string;\n switch (true) {\n case !!(btn as ButtonURL).url:\n name = 'cta_url';\n buttonParamsJson.url = (btn as ButtonURL).url;\n break;\n case !!(btn as ButtonCopy).copy:\n name = 'cta_copy';\n buttonParamsJson.copy_code = (btn as ButtonCopy).copy;\n break;\n case !!(btn as ButtonPhone).tel:\n name = 'cta_call';\n buttonParamsJson.phone_number = (btn as ButtonPhone).tel;\n break;\n case !!(btn as ButtonEmail).email:\n name = 'cta_email';\n buttonParamsJson.email = (btn as ButtonEmail).email;\n break;\n case !!((btn as ButtonReminder).reminderOn || (btn as ButtonReminder).reminderDate):\n name = 'cta_reminder';\n const { reminderOn, reminderDate } = btn as ButtonReminder;\n buttonParamsJson.reminder_name = (btn as ButtonReminder).reminderName;\n buttonParamsJson.reminder_timestamp = reminderDate\n ? Math.floor(+new Date(reminderDate) / 1000)\n : Math.floor(Date.now() / 1000) + getTotalSeconds(reminderOn ?? '0s');\n break;\n default:\n name = '';\n break;\n }\n\n return { name, buttonParamsJson: JSON.stringify(buttonParamsJson) };\n })\n .filter((v) => v.name);\n\n const msg = generateWAMessageFromContent(\n jid,\n {\n viewOnceMessage: {\n message: {\n interactiveMessage: proto.Message.InteractiveMessage.create({\n ...(title && {\n body: proto.Message.InteractiveMessage.Body.create({ text: title }),\n }),\n ...(subtitle && {\n footer: proto.Message.InteractiveMessage.Footer.create({ text: subtitle }),\n }),\n ...(!!buttonsValue?.length && {\n nativeFlowMessage: proto.Message.InteractiveMessage.NativeFlowMessage.create({\n buttons: buttonsValue,\n }),\n }),\n }),\n },\n },\n },\n { userJid: jid }\n );\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'send buttons message', {\n jid,\n footer: subtitle,\n body: title,\n buttons: buttonsValue,\n });\n }\n\n return this.socket.relayMessage(jid, msg.message!, { messageId: msg.key.id! });\n }\n\n async sendReplyButtonsMessage(\n to: string,\n {\n title,\n subtitle,\n buttons,\n }: {\n title: string;\n subtitle?: string;\n buttons: string[];\n }\n ): Promise<any> {\n if (!title || !buttons.length) {\n throw new Error('sendReplyButtonsMessage: No title or buttons required field found.');\n }\n\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketMessages.formatPhoneNumberToWhatsappPattern(to);\n\n const buttonsValue = buttons\n .filter((v) => v)\n .map((displayText, index) => ({ buttonId: `id${index}`, buttonText: { displayText }, type: 1 }));\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'send reply buttons message', {\n jid,\n text: title,\n footer: subtitle,\n buttons: buttonsValue,\n });\n }\n\n return this.socket.sendMessage(jid, {\n text: title,\n ...(subtitle && { footer: subtitle }),\n buttons: buttonsValue /* type: UNKNOWN = 0, RESPONSE = 1, NATIVE_FLOW = 2 */,\n });\n }\n}\n","import { type AnyMessageContent } from '@fadzzzslebew/baileys';\nimport { Readable } from 'stream';\nimport { WhatsappSocketMessages, type WhatsappSocketMessagesProps } from './whatsappSocket.messages.ts';\nexport { type WhatsappSocketMessagesProps as WhatsappSocketStreamProps } from './whatsappSocket.messages';\n\nexport class WhatsappSocketStream extends WhatsappSocketMessages {\n static DEFAULT_COUNTRY_CODE: string = '972';\n\n constructor(props: WhatsappSocketMessagesProps) {\n super(props);\n }\n\n protected async sendFileFromStream(\n to: string,\n stream: Readable | Buffer,\n options: {\n filename: string;\n mimetype?: string;\n caption?: string;\n replyToMessageId?: string;\n // File type specific options\n ptt?: boolean; // Push to talk (voice note)\n seconds?: number; // Duration for audio/video\n gifPlayback?: boolean; // For GIF videos\n // Additional options\n jpegThumbnail?: Buffer | string; // Thumbnail for videos/documents\n }\n ): Promise<any> {\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketStream.formatPhoneNumberToWhatsappPattern(to);\n\n // Convert stream to buffer if needed\n const buffer = stream instanceof Buffer ? stream : await this.streamToBuffer(stream as Readable);\n\n // Auto-detect mimetype if not provided\n const mimetype = options.mimetype || this.getMimetypeFromFilename(options.filename);\n\n // Determine message type based on mimetype\n const messageContent = await this.createFileMessage(buffer, mimetype, options);\n\n const messageOptions: any = {\n ...(options.replyToMessageId && {\n quoted: { key: { id: options.replyToMessageId } },\n }),\n };\n\n return this.socket.sendMessage(jid, messageContent, messageOptions);\n }\n\n private async streamToBuffer(stream: Readable): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n stream.on('data', (chunk) => chunks.push(Buffer.from(chunk)));\n stream.on('error', (err) => reject(err));\n stream.on('end', () => resolve(Buffer.concat(chunks)));\n });\n }\n\n private getMimetypeFromFilename(filename: string): string {\n const ext = filename.split('.').pop()?.toLowerCase();\n\n const mimetypes: { [key: string]: string } = {\n // Images\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n png: 'image/png',\n gif: 'image/gif',\n webp: 'image/webp',\n bmp: 'image/bmp',\n svg: 'image/svg+xml',\n\n // Videos\n mp4: 'video/mp4',\n avi: 'video/x-msvideo',\n mov: 'video/quicktime',\n mkv: 'video/x-matroska',\n webm: 'video/webm',\n\n // Audio\n mp3: 'audio/mpeg',\n wav: 'audio/wav',\n ogg: 'audio/ogg',\n opus: 'audio/opus',\n aac: 'audio/aac',\n m4a: 'audio/mp4',\n\n // Documents\n pdf: 'application/pdf',\n doc: 'application/msword',\n docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n xls: 'application/vnd.ms-excel',\n xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n ppt: 'application/vnd.ms-powerpoint',\n pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n txt: 'text/plain',\n zip: 'application/zip',\n rar: 'application/x-rar-compressed',\n '7z': 'application/x-7z-compressed',\n };\n\n return mimetypes[ext || ''] || 'application/octet-stream';\n }\n\n private async createFileMessage(\n buffer: Buffer,\n mimetype: string,\n options: {\n filename: string;\n caption?: string;\n ptt?: boolean;\n seconds?: number;\n gifPlayback?: boolean;\n jpegThumbnail?: Buffer | string;\n }\n ): Promise<AnyMessageContent> {\n const [type] = mimetype.split('/');\n\n switch (type) {\n case 'image':\n return {\n image: buffer,\n caption: options.caption,\n mimetype,\n fileName: options.filename,\n };\n\n case 'video':\n return {\n video: buffer,\n caption: options.caption,\n mimetype,\n fileName: options.filename,\n gifPlayback: options.gifPlayback || false,\n jpegThumbnail: options.jpegThumbnail as string,\n ...(options.seconds && { seconds: options.seconds }),\n };\n\n case 'audio':\n if (options.ptt) {\n // Voice note\n return {\n audio: buffer,\n mimetype: 'audio/ogg; codecs=opus',\n ptt: true,\n ...(options.seconds && { seconds: options.seconds }),\n };\n }\n return {\n audio: buffer,\n mimetype,\n fileName: options.filename,\n ...(options.seconds && { seconds: options.seconds }),\n };\n\n default:\n // Document (PDF, DOC, etc.)\n return {\n document: buffer,\n mimetype,\n fileName: options.filename,\n caption: options.caption,\n jpegThumbnail: options.jpegThumbnail as string,\n };\n }\n }\n\n // Helper method to send specific file types\n protected async sendImage(\n to: string,\n imageBuffer: Buffer | Readable,\n options: {\n caption?: string;\n filename?: string;\n replyToMessageId?: string;\n } = {}\n ): Promise<any> {\n return this.sendFileFromStream(to, imageBuffer, {\n filename: options.filename || 'image.jpg',\n mimetype: 'image/jpeg',\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 mimetype: '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' : 'audio/mpeg',\n ptt: options.ptt,\n seconds: options.seconds,\n replyToMessageId: options.replyToMessageId,\n });\n }\n\n protected async sendDocument(\n to: string,\n documentBuffer: Buffer | Readable,\n options: {\n filename: string;\n caption?: string;\n mimetype?: string;\n replyToMessageId?: string;\n jpegThumbnail?: Buffer;\n }\n ): Promise<any> {\n return this.sendFileFromStream(to, documentBuffer, {\n filename: options.filename,\n mimetype: options.mimetype,\n caption: options.caption,\n replyToMessageId: options.replyToMessageId,\n jpegThumbnail: options.jpegThumbnail,\n });\n }\n\n protected async sendVoiceNote(\n to: string,\n audioBuffer: Buffer | Readable,\n options: {\n seconds?: number;\n replyToMessageId?: string;\n } = {}\n ): Promise<any> {\n return this.sendAudio(to, audioBuffer, {\n ptt: true,\n seconds: options.seconds,\n replyToMessageId: options.replyToMessageId,\n });\n }\n\n protected async sendSticker(\n to: string,\n stickerBuffer: Buffer | Readable,\n options: {\n replyToMessageId?: string;\n } = {}\n ): Promise<any> {\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketStream.formatPhoneNumberToWhatsappPattern(to);\n const buffer =\n stickerBuffer instanceof Buffer ? stickerBuffer : await this.streamToBuffer(stickerBuffer as Readable);\n\n const messageOptions: any = {\n ...(options.replyToMessageId && {\n quoted: { key: { id: options.replyToMessageId } },\n }),\n };\n\n return this.socket.sendMessage(jid, { sticker: buffer }, messageOptions);\n }\n}\n","import { ReadStream } from 'node:fs';\n\nimport { WhatsappSocketStream, type WhatsappSocketStreamProps } from './whatsappSocket.stream';\nexport { type WhatsappSocketStreamProps as WhatsappSocketFilesProps } from './whatsappSocket.stream';\nimport { getAudioFileDuration, getFilenameFromStream, getUrlBuffer, streamToBuffer } from './helpers.ts';\nimport { basename } from 'node:path';\n\nexport class WhatsappSocketFiles extends WhatsappSocketStream {\n static DEFAULT_COUNTRY_CODE: string = '972';\n\n constructor(props: WhatsappSocketStreamProps) {\n super(props);\n }\n\n async sendImageMessage(\n to: string,\n imageSrc: string | Buffer<any> | ReadStream,\n { caption = '', filename }: { caption?: string; filename?: string } = {}\n ) {\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketFiles.formatPhoneNumberToWhatsappPattern(to);\n const imageData = typeof imageSrc === 'string' ? await getUrlBuffer(imageSrc) : imageSrc;\n\n if (this.debug) this.logger?.debug('WHATSAPP', 'send image message', { jid, caption, filename });\n return await super.sendImage(jid, imageData, { caption, ...(filename && { filename }) });\n }\n\n async sendVideoMessage(\n to: string,\n videoSrc: string | Buffer<any> | ReadStream,\n {\n caption = '',\n filename,\n sendAsGifPlayback: gifPlayback = false,\n }: { caption?: string; sendAsGifPlayback?: boolean; filename?: string } = {}\n ) {\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketFiles.formatPhoneNumberToWhatsappPattern(to);\n const videoBuffer = typeof videoSrc === 'string' ? await getUrlBuffer(videoSrc) : videoSrc;\n\n if (this.debug) this.logger?.debug('WHATSAPP', 'send video message', { jid, caption, filename, gifPlayback });\n return await super.sendVideo(jid, videoBuffer, { caption, gifPlayback, ...(filename && { filename }) });\n }\n\n async sendFileMessage(\n to: string,\n fileSrc: string | Buffer<any> | ReadStream,\n {\n caption = '',\n mimetype = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n replyToMessageId,\n jpegThumbnailSrc,\n filename: _filename,\n }: {\n caption?: string;\n mimetype?: string;\n filename?: string;\n replyToMessageId?: string;\n jpegThumbnailSrc?: string | Buffer<any> | ReadStream;\n } = {}\n ) {\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketFiles.formatPhoneNumberToWhatsappPattern(to);\n const fileBuffer = typeof fileSrc === 'string' ? await getUrlBuffer(fileSrc) : fileSrc;\n\n let jpegThumbnailBuffer: Buffer<any> | undefined;\n if (typeof jpegThumbnailSrc === 'string') {\n jpegThumbnailBuffer = await getUrlBuffer(jpegThumbnailSrc);\n } else if (jpegThumbnailSrc instanceof ReadStream) {\n jpegThumbnailBuffer = await streamToBuffer(jpegThumbnailSrc);\n } else {\n jpegThumbnailBuffer = jpegThumbnailSrc;\n }\n\n let filename = 'mu-document';\n if (fileSrc instanceof ReadStream) {\n const fname = getFilenameFromStream(fileSrc);\n if (fname) filename = fname;\n } else if (typeof fileSrc === 'string') {\n filename = basename(fileSrc);\n }\n\n if (this.debug)\n this.logger?.debug('WHATSAPP', 'send file message', {\n jid,\n caption,\n mimetype,\n filename,\n replyToMessageId,\n includeJpegThumbnail: !!jpegThumbnailBuffer,\n });\n return await super.sendDocument(jid, fileBuffer, {\n caption,\n mimetype,\n filename,\n replyToMessageId,\n jpegThumbnail: jpegThumbnailBuffer,\n });\n }\n\n async sendAudioMessage(\n to: string,\n audioSrc: string | Buffer<any> | ReadStream,\n {\n filename,\n replyToMessageId,\n mimetype,\n seconds,\n }: { filename?: string; replyToMessageId?: string; mimetype?: string; seconds?: number } = {}\n ) {\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketFiles.formatPhoneNumberToWhatsappPattern(to);\n const audioBuffer = typeof audioSrc === 'string' ? await getUrlBuffer(audioSrc) : audioSrc;\n let durationInSeconds = seconds || (await getAudioFileDuration(audioBuffer, mimetype).catch(() => 0));\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'send audio message', {\n jid,\n mimetype,\n filename,\n seconds: durationInSeconds,\n replyToMessageId,\n });\n }\n\n return await super.sendAudio(jid, audioBuffer, {\n ...(filename && { filename }),\n ...(mimetype && { mimetype: mimetype }),\n ...(durationInSeconds && { seconds: durationInSeconds }),\n ...(replyToMessageId && { replyToMessageId: replyToMessageId }),\n });\n }\n\n /**\n * requirements:\n * * format .webp\n * * imageSize 512pxx512px\n * * maxSize: 100kb\n * * transparent background\n * @param to\n * @param imageSrc\n * @param replyToMessageId\n */\n async sendStickerMessage(\n to: string,\n imageSrc: string | Buffer<any> | ReadStream,\n { replyToMessageId }: { replyToMessageId?: string } = {}\n ) {\n if (!this.socket) {\n if (this.debug) this.logger?.warn('WHATSAPP', 'Client not connected, attempting to connect...');\n this.socket = await this.startConnection();\n }\n\n const jid = WhatsappSocketFiles.formatPhoneNumberToWhatsappPattern(to);\n const stickerBuffer = typeof imageSrc === 'string' ? await getUrlBuffer(imageSrc) : imageSrc;\n\n if (this.debug) this.logger?.debug('WHATSAPP', 'send sticker message', { jid, replyToMessageId });\n await super.sendSticker(jid, stickerBuffer, { replyToMessageId });\n }\n}\n","import { WhatsappSocketFiles, type WhatsappSocketFilesProps } from './whatsappSocket.files';\n\nexport class WhatsappSocket extends WhatsappSocketFiles {\n constructor(props: WhatsappSocketFilesProps) {\n super(props);\n }\n}\n"]}
|