const axios = require('axios') const { globalApiKey, disabledCallbacks, enableWebHook } = require('./config') const { logger } = require('./logger') // Trigger webhook endpoint const triggerWebhook = (webhookURL, sessionId, dataType, data) => { if (enableWebHook) { axios.post(webhookURL, { dataType, data, sessionId }, { headers: { 'x-api-key': globalApiKey } }) .then(() => logger.debug({ sessionId, dataType, data: data || '' }, `Webhook message sent to ${webhookURL}`)) .catch(error => logger.error({ sessionId, dataType, err: error, data: data || '' }, `Failed to send webhook message to ${webhookURL}`)) } } // Function to send a response with error status and message const sendErrorResponse = (res, status, message) => { res.status(status).json({ success: false, error: message }) } // Function to wait for a specific item not to be null const waitForNestedObject = (rootObj, nestedPath, maxWaitTime = 10000, interval = 100) => { const start = Date.now() return new Promise((resolve, reject) => { const checkObject = () => { const nestedObj = nestedPath.split('.').reduce((obj, key) => obj ? obj[key] : undefined, rootObj) if (nestedObj) { // Nested object exists, resolve the promise resolve() } else if (Date.now() - start > maxWaitTime) { // Maximum wait time exceeded, reject the promise logger.error('Timed out waiting for nested object') reject(new Error('Timeout waiting for nested object')) } else { // Nested object not yet created, continue waiting setTimeout(checkObject, interval) } } checkObject() }) } const checkIfEventisEnabled = (event) => { return new Promise((resolve) => { if (!disabledCallbacks.includes(event)) { resolve() } }) } const sendMessageSeenStatus = async (message) => { try { const chat = await message.getChat() await chat.sendSeen() } catch (error) { logger.error(error, 'Failed to send seen status') } } module.exports = { triggerWebhook, sendErrorResponse, waitForNestedObject, checkIfEventisEnabled, sendMessageSeenStatus }