flexbiz-server
Version:
Flexible Server
13 lines (12 loc) • 5.42 kB
JavaScript
const axios=require("axios"),_=require("lodash"),{compileHtml}=require("../../libs/utils"),{getPageAccessToken}=require("../utils");
async function sendMsg($pageId$$,$fbError_pageAccessToken$$,$recipientId$$,$messageData_requestBody$$,$axiosAbortController$$,$tag$$){$messageData_requestBody$$={recipient:{id:$recipientId$$},messaging_type:$tag$$?"MESSAGE_TAG":"RESPONSE",message:$messageData_requestBody$$};$tag$$&&($messageData_requestBody$$.tag=$tag$$);try{return(await axios.post("https://graph.facebook.com/v19.0/me/messages",$messageData_requestBody$$,{headers:{"Content-Type":"application/json"},params:{access_token:$fbError_pageAccessToken$$},
signal:$axiosAbortController$$.signal})).data}catch($error$$){Logger.error(`Error sending Facebook message to ${$recipientId$$}:`,$error$$.response?.data||$error$$.message);if($error$$.response?.data?.error)throw $fbError_pageAccessToken$$=$error$$.response.data.error,Error(`Facebook API Error (${$fbError_pageAccessToken$$.code} - ${$fbError_pageAccessToken$$.type}): ${$fbError_pageAccessToken$$.message} (Subcode: ${$fbError_pageAccessToken$$.error_subcode}), pageId:${$pageId$$}, recipientId:${$recipientId$$}, tag: ${$tag$$}`);
if(axios.isCancel($error$$))throw new DOMException("Facebook message sending cancelled","AbortError");throw Error(`Network or unknown error sending message: ${$error$$.message}`);}}
async function facebooksendmessage($flowState$$,$node$$,$payloads$$,$abortSignal$$){const $nodeInstanceId$$=`${$flowState$$.instanceId}-${$node$$.id}`,$nodeLabel$$=$node$$.data?.name||$node$$.id||"Facebook Send Message";Logger.info(`[${$nodeInstanceId$$}] ${$nodeLabel$$}: Executing.`);if($abortSignal$$.aborted)throw Logger.info(`[${$nodeInstanceId$$}] ${$nodeLabel$$}: Aborted before execution.`),new DOMException("Aborted before sending message","AbortError");_.isArray($payloads$$)||($payloads$$=[$payloads$$]);
$payloads$$.forEach($payload$$=>{$payload$$.recipientId=$payload$$?.recipientId||$payload$$?.receiver?.id||$payload$$.fb_id||$node$$.data?.recipientId});$payloads$$=$payloads$$.filter($p$$=>$p$$.recipientId);if($payloads$$.length==0)throw Error(`[${$nodeInstanceId$$}] ${$nodeLabel$$}: Missing recipient ID (payload.recipientId or payload.receiver.id or node.data.recipientId)`);const $axiosAbortController$$=new AbortController,$abortListener$$=()=>$axiosAbortController$$.abort();$abortSignal$$.addEventListener("abort",
$abortListener$$,{once:!0});try{await Promise.all($payloads$$.map($payload$$=>(async()=>{const $recipientId$$=$payload$$?.recipientId,$pageId$$=$node$$.data?.pageId||$payload$$?.page_id;if(!$pageId$$)throw Error(`[${$nodeInstanceId$$}] ${$nodeLabel$$}: Missing Page ID (node.data.pageId or payload.page_id)`);const $pageAccessToken$$=$node$$.data?.pageAccessToken||await getPageAccessToken($flowState$$.flowDefinition.id_app,$pageId$$);if(!$pageAccessToken$$)throw Error(`[${$nodeInstanceId$$}] ${$nodeLabel$$}: Failed to retrieve Page Access Token for Page ID ${$pageId$$}. Cannot send message.`);
let $messageData$$;if($payload$$?.message&&typeof $payload$$.message==="object")$messageData$$=$payload$$.message,Logger.info(`[${$nodeInstanceId$$}] ${$nodeLabel$$}: Using message from input payload.`);else if($node$$.data?.messageTemplate)try{$messageData$$=JSON.parse($node$$.data.messageTemplate),Logger.info(`[${$nodeInstanceId$$}] ${$nodeLabel$$}: Using message template from node configuration.`)}catch($parseError$$){throw Logger.error(`[${$nodeInstanceId$$}] ${$nodeLabel$$}: Error parsing messageTemplate JSON from node data:`,
$parseError$$),Error("Invalid message template JSON in node configuration.");}else{let $textToSend$$=$payload$$?.messageText||$payload$$?.message||$node$$.data?.defaultMessage;if(typeof $textToSend$$==="string"&&$textToSend$$.trim()!==""){try{if($textToSend$$=compileHtml($textToSend$$,{payload:$payload$$}),$abortSignal$$.aborted)throw Logger.info(`[${$nodeInstanceId$$}] Function node aborted immediately after execution (code might have finished).`),new DOMException("Function node aborted after execution",
"AbortError");}catch($executionError$$){throw Logger.error(`[${$nodeInstanceId$$}] Error executing function node code:`,$executionError$$),Error(`Function node error: ${$executionError$$.message}`);}$messageData$$={text:$textToSend$$};Logger.info(`[${$nodeInstanceId$$}] ${$nodeLabel$$}: Using text message: "${$textToSend$$.substring(0,50)}..."`)}else throw Error(`[${$nodeInstanceId$$}] ${$nodeLabel$$}: No message content found (payload.messagePayload, node.data.messageTemplate, payload.messageText, or node.data.defaultMessage).`);
}Logger.info(`[${$nodeInstanceId$$}] ${$nodeLabel$$}: Sending message to ${$recipientId$$} via Page ${$pageId$$}...`);return await sendMsg($pageId$$,$pageAccessToken$$,$recipientId$$,$messageData$$,$axiosAbortController$$,$payload$$?.tag||$node$$.data?.tag)})()))}catch($error$$){if($error$$.response?.data?.error){const $fbError$$=$error$$.response.data.error;throw Error(`Facebook API Error (${$fbError$$.code} - ${$fbError$$.type}): ${$fbError$$.message} (Subcode: ${$fbError$$.error_subcode})`);}if(axios.isCancel($error$$))throw Logger.info(`[${$nodeInstanceId$$}] ${$nodeLabel$$}: Facebook message sending cancelled.`),
new DOMException("Facebook message sending cancelled","AbortError");throw Error($error$$.message);}finally{$abortSignal$$.removeEventListener("abort",$abortListener$$)}}module.exports=facebooksendmessage;