@hdriel/whatsapp-socket 1.0.6 → 1.2.0
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 +11 -8
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +186 -8
- package/dist/index.d.ts +186 -8
- package/dist/index.js +2 -2
- 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/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","messageQuery","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 readonly 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 = WhatsappSocketBase.DEFAULT_COUNTRY_CODE,\n }: {\n phone: string;\n countryCode?: string;\n message?: string;\n }) {\n const formattedPhone = this.formatPhoneNumber(phone, countryCode);\n const messageQuery = message ? `?text=${encodeURI(message)}` : '';\n return `https://wa.me/${formattedPhone}${messageQuery}`;\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 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 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.private.messages.ts","../src/whatsappSocket.private.stream.ts","../src/whatsappSocket.private.files.ts","../src/whatsappSocket.private.client.ts","../src/whatsappSocket.group.management.ts","../src/whatsappSocket.group.messages.ts","../src/whatsappSocket.group.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","messageQuery","qr","options","QRCode","pattern","length","result","pool","buildPool","block","chars","i","start","end","c","char","upperCaseResult","props","instanceKey","fileAuthStateDirectoryPath","mongoURL","mongoCollection","logger","onOpen","onClose","onQR","onReceiveMessages","onConnectionStatusChange","debug","printQRInTerminal","pairingPhone","customPairingCode","onPreConnectionSendMessageFailed","appName","sources","response","mongoClient","MongoClient","saveCreds","state","useMultiFileAuthState","makeCacheableSignalKeyStore","sock","connectionAttempts","_pairingPhone","_debug","auth","version","connect","makeWASocket","jid","connection","lastDisconnect","qrcode","pairing","code","shouldReconnect","DisconnectReason","statusCode","errorMessage","messages","socket","fs","autoConnect","WhatsappSocketPrivateMessages","_WhatsappSocketPrivateMessages","to","text","replyToMessageId","subtitle","title","buttons","buttonsValue","btn","buttonParamsJson","name","reminderOn","reminderDate","v","msg","generateWAMessageFromContent","index","WhatsappSocketPrivateStream","_WhatsappSocketPrivateStream","mimetype","messageContent","messageOptions","reject","err","filename","ext","imageBuffer","videoBuffer","audioBuffer","documentBuffer","stickerBuffer","WhatsappSocketPrivateFiles","_WhatsappSocketPrivateFiles","imageSrc","caption","imageData","videoSrc","gifPlayback","fileSrc","jpegThumbnailSrc","_filename","fileBuffer","jpegThumbnailBuffer","fname","audioSrc","seconds","durationInSeconds","WhatsappSocket","WhatsappSocketGroups","_WhatsappSocketGroups","groupId","participants","description","formattedParticipants","selfJid","pId","formattedGroupId","newName","setting","groups","inviteCode","highRes","WhatsappSocketGroupMessages","_WhatsappSocketGroupMessages","mentions","fileName","latitude","longitude","address","groupMetadata","p","messageId","emoji","WhatsappSocketGroup"],"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 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 readonly 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.replace(/:\\d+@/, '@'); // remove the sessionId\n }\n\n static getWhatsappPhoneLink({\n phone,\n message,\n countryCode = WhatsappSocketBase.DEFAULT_COUNTRY_CODE,\n }: {\n phone: string;\n countryCode?: string;\n message?: string;\n }) {\n const formattedPhone = this.formatPhoneNumber(phone, countryCode);\n const messageQuery = message ? `?text=${encodeURI(message)}` : '';\n return `https://wa.me/${formattedPhone}${messageQuery}`;\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 private static instances: Map<string, WASocket | null> = new Map();\n\n static getInstance(props: WhatsappSocketBaseProps): WASocket {\n const instanceKey = WhatsappSocketBase.buildSocketKey(props);\n if (!WhatsappSocketBase.instances.has(instanceKey)) {\n new WhatsappSocketBase(props);\n }\n\n return WhatsappSocketBase.instances.get(instanceKey)!;\n }\n\n static clearInstance(key?: string): void {\n if (key) {\n WhatsappSocketBase.instances.delete(key);\n } else {\n WhatsappSocketBase.instances.clear();\n }\n }\n\n constructor(props: WhatsappSocketBaseProps) {\n const {\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 } = props;\n\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.onPreConnectionSendMessageFailed = onPreConnectionSendMessageFailed;\n this.onConnectionStatusChange = onConnectionStatusChange;\n this.onReceiveMessages = onReceiveMessages;\n this.onOpen = onOpen;\n this.onClose = onClose;\n this.onQR = onQR;\n\n if (WhatsappSocketBase.instances.has(this.socketKey)) {\n this.socket = WhatsappSocketBase.instances.get(this.socketKey)!;\n // instance.logger?.debug('WHATSAPP', 'RETURN SINGLETON INSTANCE!');\n }\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 static buildSocketKey(props: Partial<WhatsappSocketBaseProps>) {\n return (\n props.appName ||\n props.pairingPhone ||\n props.mongoCollection ||\n props.fileAuthStateDirectoryPath ||\n 'default'\n );\n }\n\n get socketKey(): string {\n return (\n this.appName || this.pairingPhone || this.mongoCollection || this.fileAuthStateDirectoryPath || 'default'\n );\n }\n\n get socket(): WASocket | null {\n return WhatsappSocketBase.instances.get(this.socketKey) ?? null;\n }\n\n set socket(sock: WASocket | null) {\n WhatsappSocketBase.instances.set(this.socketKey, sock);\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: true, // 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?.user;\n }\n}\n","import { type MiscMessageGenerationOptions, generateWAMessageFromContent } from '@fadzzzslebew/baileys';\nimport { WAProto as proto } from '@fadzzzslebew/baileys';\nimport { WhatsappSocketBase, type WhatsappSocketBaseProps } from './whatsappSocket.base';\nexport type { WhatsappSocketBaseProps as WhatsappSocketMessagesProps } from './whatsappSocket.base';\nimport { getTotalSeconds } from './helpers';\nimport type {\n ButtonURL,\n ButtonReminder,\n ButtonEmail,\n ButtonCopy,\n ButtonPhone,\n ButtonParamsJson,\n CallToActionButtons,\n CallToActionFullButtons,\n} from './decs';\n\nexport class WhatsappSocketPrivateMessages extends WhatsappSocketBase {\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 = WhatsappSocketPrivateMessages.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 = WhatsappSocketPrivateMessages.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 = WhatsappSocketPrivateMessages.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 { WhatsappSocketPrivateMessages, type WhatsappSocketMessagesProps } from './whatsappSocket.private.messages.ts';\nimport { MIME_TYPES } from './helpers.ts';\nexport { type WhatsappSocketMessagesProps as WhatsappSocketStreamProps } from './whatsappSocket.private.messages.ts';\n\nexport class WhatsappSocketPrivateStream extends WhatsappSocketPrivateMessages {\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 = WhatsappSocketPrivateStream.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 = WhatsappSocketPrivateStream.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 { WhatsappSocketPrivateStream, type WhatsappSocketStreamProps } from './whatsappSocket.private.stream.ts';\nexport { type WhatsappSocketStreamProps as WhatsappSocketFilesProps } from './whatsappSocket.private.stream.ts';\nimport { getAudioFileDuration, getFilenameFromStream, getUrlBuffer, streamToBuffer } from './helpers.ts';\nimport { basename } from 'node:path';\n\nexport class WhatsappSocketPrivateFiles extends WhatsappSocketPrivateStream {\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 = WhatsappSocketPrivateFiles.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 = WhatsappSocketPrivateFiles.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 = WhatsappSocketPrivateFiles.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 = WhatsappSocketPrivateFiles.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 = WhatsappSocketPrivateFiles.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 { WhatsappSocketPrivateFiles } from './whatsappSocket.private.files.ts';\nimport type { WhatsappSocketGroupMessagesProps } from './whatsappSocket.group.messages.ts';\n\nexport class WhatsappSocket extends WhatsappSocketPrivateFiles {\n /*\n private static instances: Map<string, WhatsappSocket> = new Map();\n\n static getInstance(props: WhatsappSocketBaseProps): WhatsappSocket {\n const instanceKey =\n props.appName ||\n props.pairingPhone ||\n props.mongoCollection ||\n props.fileAuthStateDirectoryPath ||\n 'default';\n\n if (!WhatsappSocket.instances.has(instanceKey)) {\n new WhatsappSocket(props);\n }\n\n return WhatsappSocket.instances.get(instanceKey)!;\n }\n\n static clearInstance(key?: string): void {\n if (key) {\n WhatsappSocket.instances.delete(key);\n } else {\n WhatsappSocket.instances.clear();\n }\n }\n\n constructor(props: WhatsappSocketFilesProps) {\n const instanceKey =\n props.appName ||\n props.pairingPhone ||\n props.mongoCollection ||\n props.fileAuthStateDirectoryPath ||\n 'default';\n\n if (WhatsappSocket.instances.has(instanceKey)) {\n const instance = WhatsappSocket.instances.get(instanceKey)!;\n // instance.logger?.debug('WHATSAPP', 'RETURN SINGLETON INSTANCE!');\n return instance;\n }\n\n super(props);\n\n WhatsappSocket.instances.set(instanceKey, this);\n }\n */\n\n constructor(props: WhatsappSocketGroupMessagesProps) {\n super(props);\n }\n}\n","import type { GroupMetadata } from '@fadzzzslebew/baileys';\nimport { WhatsappSocketBase, type WhatsappSocketBaseProps } from './whatsappSocket.base';\nimport type { CreateGroupOptions, GroupSettingsType } from './decs';\nexport type { WhatsappSocketBaseProps as WhatsappSocketGroupsProps } from './whatsappSocket.base';\n\nexport class WhatsappSocketGroups extends WhatsappSocketBase {\n /**\n * פורמט Group ID לתבנית WhatsApp\n * Format Group ID to WhatsApp pattern\n * Group IDs end with @g.us instead of @s.whatsapp.net\n */\n static formatGroupId(groupId: string): string {\n if (groupId.endsWith('@g.us')) return groupId;\n const cleanId = groupId.replace(/@s\\.whatsapp\\.net|@g\\.us/g, '');\n\n return `${cleanId}@g.us`;\n }\n\n /**\n * בדיקה האם מדובר ב-Group ID או Phone Number\n * Check if this is a group ID or phone number\n */\n static isGroupId(jid: string): boolean {\n return jid.endsWith('@g.us');\n }\n\n constructor(props: WhatsappSocketBaseProps) {\n super(props);\n }\n\n /**\n * Create a new WhatsApp group\n */\n async createGroup({ name, participants, description }: CreateGroupOptions): Promise<any> {\n if (!name) {\n throw new Error('createGroup: Group name is required.');\n }\n await this.ensureSocketConnected();\n\n // Format phone numbers to WhatsApp pattern\n const formattedParticipants: string[] = (participants ?? []).map((phone) =>\n WhatsappSocketGroups.formatPhoneNumberToWhatsappPattern(phone)\n );\n\n // If no participants provided, use self (bot's own number)\n if (formattedParticipants.length === 0) {\n const selfJid = this.socket?.user?.id; // Get bot's own JID (user ID)\n if (!selfJid) {\n throw new Error('createGroup: Could not get bot user ID. Make sure socket is connected.');\n }\n\n const pId = WhatsappSocketGroups.formatPhoneNumberToWhatsappPattern(selfJid);\n formattedParticipants.push(pId);\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'No participants provided, creating group with self only', {\n selfJid,\n });\n }\n }\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'Creating group', {\n name,\n participantsCount: formattedParticipants.length,\n });\n }\n\n const result = await this.socket?.groupCreate(name, formattedParticipants);\n\n // Set description if provided\n if (description && result?.id) {\n const formattedGroupId = WhatsappSocketGroups.formatGroupId(result.id);\n await this.updateGroupDescription(formattedGroupId, description);\n }\n\n return result;\n }\n\n /**\n * Update group name (subject)\n */\n async updateGroupName(groupId: string, newName: string): Promise<any> {\n if (!groupId || !newName) {\n throw new Error('updateGroupName: Group ID and new name are required.');\n }\n\n await this.ensureSocketConnected();\n\n const formattedGroupId = WhatsappSocketGroups.formatGroupId(groupId);\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'Updating group name', { groupId: formattedGroupId, newName });\n }\n\n return this.socket?.groupUpdateSubject(formattedGroupId, newName);\n }\n\n /**\n * Update group description\n */\n async updateGroupDescription(groupId: string, description: string): Promise<any> {\n if (!groupId) {\n throw new Error('updateGroupDescription: Group ID is required.');\n }\n\n await this.ensureSocketConnected();\n\n const formattedGroupId = WhatsappSocketGroups.formatGroupId(groupId);\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'Updating group description', { groupId: formattedGroupId });\n }\n\n return this.socket?.groupUpdateDescription(formattedGroupId, description || '');\n }\n\n /**\n * Update group settings (who can send messages, edit info, etc.)\n */\n async updateGroupSettings(groupId: string, setting: GroupSettingsType): Promise<any> {\n if (!groupId || !setting) {\n throw new Error('updateGroupSettings: Group ID and setting are required.');\n }\n\n await this.ensureSocketConnected();\n\n const formattedGroupId = WhatsappSocketGroups.formatGroupId(groupId);\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'Updating group settings', { groupId: formattedGroupId, setting });\n }\n\n return this.socket?.groupSettingUpdate(formattedGroupId, setting);\n }\n\n /**\n * Add participants to group\n */\n async addParticipants(groupId: string, participants: string[]): Promise<any> {\n if (!groupId) throw new Error('addParticipants: Group ID is required.');\n if (participants?.length) return;\n await this.ensureSocketConnected();\n\n const formattedGroupId = WhatsappSocketGroups.formatGroupId(groupId);\n const formattedParticipants = participants.map((phone) =>\n WhatsappSocketGroups.formatPhoneNumberToWhatsappPattern(phone)\n );\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'Adding participants to group', {\n groupId: formattedGroupId,\n participantsCount: formattedParticipants.length,\n });\n }\n\n return this.socket?.groupParticipantsUpdate(formattedGroupId, formattedParticipants, 'add');\n }\n\n /**\n * Remove participants from group\n */\n async removeParticipants(groupId: string, participants: string[]): Promise<any> {\n if (!groupId) throw new Error('removeParticipants: Group ID is required.');\n if (!participants?.length) return;\n await this.ensureSocketConnected();\n\n const formattedGroupId = WhatsappSocketGroups.formatGroupId(groupId);\n const formattedParticipants = participants.map((phone) =>\n WhatsappSocketGroups.formatPhoneNumberToWhatsappPattern(phone)\n );\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'Removing participants from group', {\n groupId: formattedGroupId,\n participantsCount: formattedParticipants.length,\n });\n }\n\n return this.socket?.groupParticipantsUpdate(formattedGroupId, formattedParticipants, 'remove');\n }\n\n /**\n * Promote participant to admin\n */\n async promoteToAdmin(groupId: string, participants: string[]): Promise<any> {\n if (!groupId) throw new Error('promoteToAdmin: Group ID is required.');\n if (!participants?.length) return;\n await this.ensureSocketConnected();\n\n const formattedGroupId = WhatsappSocketGroups.formatGroupId(groupId);\n const formattedParticipants = participants.map((phone) =>\n WhatsappSocketGroups.formatPhoneNumberToWhatsappPattern(phone)\n );\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'Promoting participants to admin', {\n groupId: formattedGroupId,\n participantsCount: formattedParticipants.length,\n });\n }\n\n return this.socket?.groupParticipantsUpdate(formattedGroupId, formattedParticipants, 'promote');\n }\n\n /**\n * הורדת משתתף ממנהל\n * Demote participant from admin\n */\n async demoteFromAdmin(groupId: string, participants: string[]): Promise<any> {\n if (!groupId) throw new Error('demoteFromAdmin: Group ID is required.');\n if (!participants?.length) return;\n await this.ensureSocketConnected();\n\n const formattedGroupId = WhatsappSocketGroups.formatGroupId(groupId);\n const formattedParticipants = participants.map((phone) =>\n WhatsappSocketGroups.formatPhoneNumberToWhatsappPattern(phone)\n );\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'Demoting participants from admin', {\n groupId: formattedGroupId,\n participantsCount: formattedParticipants.length,\n });\n }\n\n return this.socket?.groupParticipantsUpdate(formattedGroupId, formattedParticipants, 'demote');\n }\n\n /**\n * Leave a group\n */\n async leaveGroup(groupId: string): Promise<any> {\n if (!groupId) throw new Error('leaveGroup: Group ID is required.');\n await this.ensureSocketConnected();\n\n const formattedGroupId = WhatsappSocketGroups.formatGroupId(groupId);\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'Leaving group', { groupId: formattedGroupId });\n }\n\n return this.socket?.groupLeave(formattedGroupId);\n }\n\n /**\n * Get group metadata\n */\n async getGroupMetadata(groupId: string): Promise<GroupMetadata | undefined> {\n if (!groupId) throw new Error('getGroupMetadata: Group ID is required.');\n await this.ensureSocketConnected();\n\n const formattedGroupId = WhatsappSocketGroups.formatGroupId(groupId);\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'Fetching group metadata', { groupId: formattedGroupId });\n }\n\n return this.socket?.groupMetadata(formattedGroupId);\n }\n\n /**\n * Get all groups\n */\n async getAllGroups(): Promise<GroupMetadata[]> {\n await this.ensureSocketConnected();\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'Fetching all groups');\n }\n\n const groups = await this.socket?.groupFetchAllParticipating();\n return groups ? Object.values(groups) : [];\n }\n\n /**\n * Get group invite code\n */\n async getGroupInviteCode(groupId: string): Promise<string | undefined> {\n if (!groupId) throw new Error('getGroupInviteCode: Group ID is required.');\n await this.ensureSocketConnected();\n\n const formattedGroupId = WhatsappSocketGroups.formatGroupId(groupId);\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'Fetching group invite code', { groupId: formattedGroupId });\n }\n\n return this.socket?.groupInviteCode(formattedGroupId);\n }\n\n /**\n * Revoke group invite code (creates new one)\n */\n async revokeGroupInviteCode(groupId: string): Promise<string | undefined> {\n if (!groupId) throw new Error('revokeGroupInviteCode: Group ID is required.');\n await this.ensureSocketConnected();\n\n const formattedGroupId = WhatsappSocketGroups.formatGroupId(groupId);\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'Revoking group invite code', { groupId: formattedGroupId });\n }\n\n return this.socket?.groupRevokeInvite(formattedGroupId);\n }\n\n /**\n * Join group using invite code\n */\n async joinGroupViaInvite(inviteCode: string): Promise<string | undefined> {\n if (!inviteCode) throw new Error('joinGroupViaInvite: Invite code is required.');\n await this.ensureSocketConnected();\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'Joining group via invite', { inviteCode });\n }\n\n return this.socket?.groupAcceptInvite(inviteCode);\n }\n\n /**\n * Get group info from invite code\n */\n async getGroupInfoFromInvite(inviteCode: string): Promise<any> {\n if (!inviteCode) throw new Error('getGroupInfoFromInvite: Invite code is required.');\n await this.ensureSocketConnected();\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'Fetching group info from invite', { inviteCode });\n }\n\n return this.socket?.groupGetInviteInfo(inviteCode);\n }\n\n /**\n * Update group profile picture\n */\n async updateGroupProfilePicture(groupId: string, imageBuffer: Buffer): Promise<any> {\n if (!groupId || !imageBuffer) {\n throw new Error('updateGroupProfilePicture: Group ID and image buffer are required.');\n }\n await this.ensureSocketConnected();\n\n const formattedGroupId = WhatsappSocketGroups.formatGroupId(groupId);\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'Updating group profile picture', { groupId: formattedGroupId });\n }\n\n return this.socket?.updateProfilePicture(formattedGroupId, imageBuffer);\n }\n\n /**\n * Remove group profile picture\n */\n async removeGroupProfilePicture(groupId: string): Promise<any> {\n if (!groupId) throw new Error('removeGroupProfilePicture: Group ID is required.');\n await this.ensureSocketConnected();\n\n const formattedGroupId = WhatsappSocketGroups.formatGroupId(groupId);\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'Removing group profile picture', { groupId: formattedGroupId });\n }\n\n return this.socket?.removeProfilePicture(formattedGroupId);\n }\n\n /**\n * Get group profile picture URL\n */\n async getGroupProfilePicture(groupId: string, highRes: boolean = false): Promise<string | undefined> {\n if (!groupId) throw new Error('getGroupProfilePicture: Group ID is required.');\n await this.ensureSocketConnected();\n\n const formattedGroupId = WhatsappSocketGroups.formatGroupId(groupId);\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'Fetching group profile picture', { groupId: formattedGroupId, highRes });\n }\n\n return this.socket?.profilePictureUrl(formattedGroupId, highRes ? 'image' : 'preview');\n }\n}\n","import { type MiscMessageGenerationOptions, generateWAMessageFromContent } from '@fadzzzslebew/baileys';\nimport { WAProto as proto } from '@fadzzzslebew/baileys';\nimport { WhatsappSocketGroups, type WhatsappSocketGroupsProps } from './whatsappSocket.group.management';\nimport type {\n ButtonURL,\n ButtonCopy,\n ButtonPhone,\n ButtonParamsJson,\n CallToActionButtons,\n GroupMessageOptions,\n} from './decs';\n\nexport type { WhatsappSocketGroupsProps as WhatsappSocketGroupMessagesProps } from './whatsappSocket.group.management';\n\nexport class WhatsappSocketGroupMessages extends WhatsappSocketGroups {\n constructor(props: WhatsappSocketGroupsProps) {\n super(props);\n }\n\n /**\n * Send text message to group\n */\n async sendTextMessage(groupId: string, text: string, options?: GroupMessageOptions): Promise<any> {\n if (!groupId || !text) {\n throw new Error('sendTextMessage: Group ID and text are required.');\n }\n await this.ensureSocketConnected();\n\n const formattedGroupId = WhatsappSocketGroupMessages.formatGroupId(groupId);\n const messageOptions: MiscMessageGenerationOptions = {};\n\n // // Add mentions if provided\n // if (options?.mentions?.length) {\n // const formattedMentions = options.mentions.map((phone) =>\n // WhatsappSocketGroupMessages.formatPhoneNumberToWhatsappPattern(phone)\n // );\n // messageOptions.mentions = formattedMentions;\n // }\n\n // Add reply if provided\n if (options?.replyToMessageId) {\n messageOptions.quoted = { key: { id: options.replyToMessageId } };\n }\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'Sending text message to group', {\n groupId: formattedGroupId,\n textLength: text.length,\n hasMentions: !!options?.mentions?.length,\n });\n }\n\n return this.socket?.sendMessage(formattedGroupId, { text }, messageOptions);\n }\n\n /**\n * Send buttons message to group\n */\n async sendButtonsMessage(\n groupId: string,\n {\n title,\n subtitle,\n buttons,\n }: {\n title: string;\n subtitle?: string;\n buttons: CallToActionButtons;\n }\n ): Promise<any> {\n if (!groupId || !title || !buttons?.length) {\n throw new Error('sendButtonsMessage: Group ID, title, and buttons are required.');\n }\n\n await this.ensureSocketConnected();\n\n const formattedGroupId = WhatsappSocketGroupMessages.formatGroupId(groupId);\n\n const buttonsValue = buttons\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 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 formattedGroupId,\n {\n viewOnceMessage: {\n message: {\n interactiveMessage: proto.Message.InteractiveMessage.create({\n body: proto.Message.InteractiveMessage.Body.create({ text: title }),\n ...(subtitle && {\n footer: proto.Message.InteractiveMessage.Footer.create({ text: subtitle }),\n }),\n nativeFlowMessage: proto.Message.InteractiveMessage.NativeFlowMessage.create({\n buttons: buttonsValue,\n }),\n }),\n },\n },\n },\n { userJid: formattedGroupId }\n );\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'Sending buttons message to group', {\n groupId: formattedGroupId,\n title,\n buttonsCount: buttonsValue.length,\n });\n }\n\n return this.socket?.relayMessage(formattedGroupId, msg.message!, { messageId: msg.key.id! });\n }\n\n /**\n * Send reply buttons message to group\n */\n async sendReplyButtonsMessage(\n groupId: string,\n {\n title,\n subtitle,\n buttons,\n mentions,\n }: {\n title: string;\n subtitle?: string;\n buttons: Array<string | { id: number | string; label: string }>;\n mentions?: string[];\n }\n ): Promise<any> {\n if (!groupId || !title || !buttons?.length) {\n throw new Error('sendReplyButtonsMessage: Group ID, title, and buttons are required.');\n }\n\n await this.ensureSocketConnected();\n\n const formattedGroupId = WhatsappSocketGroupMessages.formatGroupId(groupId);\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 const messageOptions: any = {\n text: title,\n buttons: buttonsValue,\n ...(subtitle && { footer: subtitle }),\n };\n\n if (mentions?.length) {\n messageOptions.mentions = mentions.map((phone) =>\n WhatsappSocketGroupMessages.formatPhoneNumberToWhatsappPattern(phone)\n );\n }\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'Sending reply buttons message to group', {\n groupId: formattedGroupId,\n title,\n buttonsCount: buttonsValue.length,\n });\n }\n\n return this.socket?.sendMessage(formattedGroupId, messageOptions);\n }\n\n /**\n * Send image to group\n */\n async sendImageMessage(\n groupId: string,\n imageBuffer: Buffer, // todo: handle also stream and string url\n { caption, mentions }: GroupMessageOptions & { caption?: string } = {}\n ): Promise<any> {\n if (!groupId || !imageBuffer) {\n throw new Error('sendImage: Group ID and image buffer are required.');\n }\n\n await this.ensureSocketConnected();\n\n const formattedGroupId = WhatsappSocketGroupMessages.formatGroupId(groupId);\n const messageOptions: any = { image: imageBuffer, ...(caption && { caption }) };\n\n if (mentions?.length) {\n messageOptions.mentions = mentions.map((phone) =>\n WhatsappSocketGroupMessages.formatPhoneNumberToWhatsappPattern(phone)\n );\n }\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'Sending image to group', {\n groupId: formattedGroupId,\n hasCaption: !!caption,\n });\n }\n\n return this.socket?.sendMessage(formattedGroupId, messageOptions);\n }\n\n /**\n * Send video to group\n */\n async sendVideoMessage(\n groupId: string,\n videoBuffer: Buffer, // todo: handle also stream and string url\n caption?: string,\n options?: GroupMessageOptions\n ): Promise<any> {\n if (!groupId || !videoBuffer) {\n throw new Error('sendVideo: Group ID and video buffer are required.');\n }\n\n await this.ensureSocketConnected();\n\n const formattedGroupId = WhatsappSocketGroupMessages.formatGroupId(groupId);\n const messageOptions: any = { video: videoBuffer, ...(caption && { caption }) };\n\n if (options?.mentions?.length) {\n messageOptions.mentions = options.mentions.map((phone) =>\n WhatsappSocketGroupMessages.formatPhoneNumberToWhatsappPattern(phone)\n );\n }\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'Sending video to group', {\n groupId: formattedGroupId,\n hasCaption: !!caption,\n });\n }\n\n return this.socket?.sendMessage(formattedGroupId, messageOptions);\n }\n\n /**\n * Send audio to group\n */\n async sendAudioMessage(\n groupId: string,\n audioBuffer: Buffer, // todo: handle also stream and string url\n options?: { ptt?: boolean; mentions?: string[] }\n ): Promise<any> {\n if (!groupId || !audioBuffer) {\n throw new Error('sendAudio: Group ID and audio buffer are required.');\n }\n\n await this.ensureSocketConnected();\n\n const formattedGroupId = WhatsappSocketGroupMessages.formatGroupId(groupId);\n const messageOptions: any = {\n audio: audioBuffer,\n ptt: options?.ptt ?? false, // PTT = Push To Talk (voice message)\n };\n\n if (options?.mentions?.length) {\n messageOptions.mentions = options.mentions.map((phone) =>\n WhatsappSocketGroupMessages.formatPhoneNumberToWhatsappPattern(phone)\n );\n }\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'Sending audio to group', {\n groupId: formattedGroupId,\n isPTT: messageOptions.ptt,\n });\n }\n\n return this.socket?.sendMessage(formattedGroupId, messageOptions);\n }\n\n /**\n * Send document to group\n */\n async sendDocumentMessage(\n groupId: string,\n documentBuffer: Buffer, // todo: handle also stream and string url\n fileName: string,\n mimeType?: string,\n options?: GroupMessageOptions\n ): Promise<any> {\n if (!groupId || !documentBuffer || !fileName) {\n throw new Error('sendDocument: Group ID, document buffer, and fileName are required.');\n }\n\n await this.ensureSocketConnected();\n\n const formattedGroupId = WhatsappSocketGroupMessages.formatGroupId(groupId);\n const messageOptions: any = {\n document: documentBuffer,\n fileName,\n ...(mimeType && { mimetype: mimeType }),\n };\n\n if (options?.mentions?.length) {\n messageOptions.mentions = options.mentions.map((phone) =>\n WhatsappSocketGroupMessages.formatPhoneNumberToWhatsappPattern(phone)\n );\n }\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'Sending document to group', {\n groupId: formattedGroupId,\n fileName,\n });\n }\n\n return this.socket?.sendMessage(formattedGroupId, messageOptions);\n }\n\n /**\n * Send location to group\n */\n async sendLocationMessage(\n groupId: string,\n latitude: number,\n longitude: number,\n name?: string,\n address?: string\n ): Promise<any> {\n if (!groupId || latitude === undefined || longitude === undefined) {\n throw new Error('sendLocation: Group ID, latitude, and longitude are required.');\n }\n\n await this.ensureSocketConnected();\n\n const formattedGroupId = WhatsappSocketGroupMessages.formatGroupId(groupId);\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'Sending location to group', {\n groupId: formattedGroupId,\n latitude,\n longitude,\n });\n }\n\n return this.socket?.sendMessage(formattedGroupId, {\n location: {\n degreesLatitude: latitude,\n degreesLongitude: longitude,\n ...(name && { name }),\n ...(address && { address }),\n },\n });\n }\n\n /**\n * Send message mentioning all group participants\n */\n async sendMentionAll(groupId: string, text: string): Promise<any> {\n if (!groupId || !text) {\n throw new Error('sendMentionAll: Group ID and text are required.');\n }\n\n await this.ensureSocketConnected();\n\n const formattedGroupId = WhatsappSocketGroupMessages.formatGroupId(groupId);\n\n // Get all group participants\n const groupMetadata = await this.getGroupMetadata(formattedGroupId);\n if (!groupMetadata) {\n throw new Error('Could not fetch group metadata');\n }\n\n const participants = groupMetadata.participants.map((p) => p.id);\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'Sending mention all message to group', {\n groupId: formattedGroupId,\n participantsCount: participants.length,\n });\n }\n\n return this.socket?.sendMessage(formattedGroupId, {\n text,\n mentions: participants,\n });\n }\n\n /**\n * Send reaction to a message in group\n */\n async sendReactionMessage(groupId: string, messageId: string, emoji: string): Promise<any> {\n if (!groupId || !messageId || !emoji) {\n throw new Error('sendReaction: Group ID, message ID, and emoji are required.');\n }\n\n await this.ensureSocketConnected();\n\n const formattedGroupId = WhatsappSocketGroupMessages.formatGroupId(groupId);\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'Sending reaction to group message', {\n groupId: formattedGroupId,\n messageId,\n emoji,\n });\n }\n\n return this.socket?.sendMessage(formattedGroupId, {\n react: {\n text: emoji,\n key: { id: messageId, remoteJid: formattedGroupId },\n },\n });\n }\n\n /**\n * Delete a message in group (only works for own messages)\n */\n async deleteGroupMessage(groupId: string, messageId: string): Promise<any> {\n if (!groupId || !messageId) {\n throw new Error('deleteGroupMessage: Group ID and message ID are required.');\n }\n\n await this.ensureSocketConnected();\n\n const formattedGroupId = WhatsappSocketGroupMessages.formatGroupId(groupId);\n\n if (this.debug) {\n this.logger?.debug('WHATSAPP', 'Deleting message in group', {\n groupId: formattedGroupId,\n messageId,\n });\n }\n\n return this.socket?.sendMessage(formattedGroupId, {\n delete: {\n id: messageId,\n remoteJid: formattedGroupId,\n fromMe: true,\n },\n });\n }\n}\n","import { WhatsappSocketGroupMessages, type WhatsappSocketGroupMessagesProps } from './whatsappSocket.group.messages';\n\nexport class WhatsappSocketGroup extends WhatsappSocketGroupMessages {\n /*\n private static instances: Map<string, WhatsappSocketGroup> = new Map();\n\n static getInstance(props: WhatsappSocketBaseProps): WhatsappSocketGroup {\n const instanceKey = WhatsappSocketGroup.buildSocketKey(props);\n if (!WhatsappSocketGroup.instances.has(instanceKey)) {\n new WhatsappSocketGroup(props);\n }\n\n return WhatsappSocketGroup.instances.get(instanceKey)!;\n }\n\n static clearInstance(key?: string): void {\n if (key) {\n WhatsappSocketGroup.instances.delete(key);\n } else {\n WhatsappSocketGroup.instances.clear();\n }\n }\n\n constructor(props: WhatsappSocketGroupMessagesProps) {\n const instanceKey = WhatsappSocketGroup.buildSocketKey(props);\n if (WhatsappSocketGroup.instances.has(instanceKey)) {\n const instance = WhatsappSocketGroup.instances.get(instanceKey)!;\n // instance.logger?.debug('WHATSAPP', 'RETURN SINGLETON INSTANCE!');\n return instance;\n }\n\n super(props);\n\n WhatsappSocketGroup.instances.set(instanceKey, this);\n }\n */\n\n constructor(props: WhatsappSocketGroupMessagesProps) {\n super(props);\n }\n}\n"]}
|