flexbiz-server
Version:
Flexible Server
15 lines (14 loc) • 5.89 kB
JavaScript
const moment=require("moment");
function setCancellableInterval($callback$$,$delay$$,$abortSignal$$){if($abortSignal$$.aborted)return Logger.info("flow aborted"),null;const $intervalId$$=setInterval(()=>{$abortSignal$$.aborted?(Logger.info("Interval callback skipped due to abort."),clearInterval($intervalId$$)):$callback$$()},$delay$$),$cleanup$$=()=>{clearInterval($intervalId$$);$abortSignal$$.removeEventListener("abort",$abortListener$$)},$abortListener$$=()=>{Logger.info("Abort signal received, clearing interval.");$cleanup$$()};
$abortSignal$$.addEventListener("abort",$abortListener$$,{once:!0});return $cleanup$$}
function setCancellableTimeout($callback$$,$delay$$,$abortSignal$$){if($abortSignal$$.aborted)return null;let $timeoutId$$=null;const $cleanup$$=()=>{$timeoutId$$&&clearTimeout($timeoutId$$);$abortSignal$$.removeEventListener("abort",$abortListener$$)},$abortListener$$=()=>{$cleanup$$()};$abortSignal$$.addEventListener("abort",$abortListener$$,{once:!0});$timeoutId$$=setTimeout(()=>{$abortSignal$$.removeEventListener("abort",$abortListener$$);$abortSignal$$.aborted||$callback$$()},$delay$$);return $cleanup$$}
async function injectHandler($flowState$$,$node$$,$__intervalMs_parts$$,$abortSignal$$){let {payloadType:$payloadType$$="date",payload:$payload$$="",repeat:$repeat$$="once",interval:$interval$$="0",interval_units:$interval_units$$="s",at:$at$$="",onceAtStart:$onceAtStart$$=!0}=$node$$.data||{};$repeat$$=="once"&&($onceAtStart$$=!0,$interval$$=0);const $nodeInstanceId$$=`${$flowState$$.instanceId}-${$node$$.id}`,$parsePayload$$=()=>{try{switch($payloadType$$){case "script":return $payload$$.indexOf("return ")<
0&&($payload$$="return "+$payload$$),(new Function("moment",$payload$$))(moment);case "json":if(typeof $payload$$==="string"&&($payload$$.startsWith("{")&&$payload$$.endsWith("}")||$payload$$.startsWith("[")&&$payload$$.endsWith("]")))try{return JSON.parse($payload$$)}catch($e$$){Logger.warn(`[${$nodeInstanceId$$}] Failed JSON parse, using string:`,$payload$$)}return $payload$$;case "number":const $n$$=Number($payload$$);return isNaN($n$$)?0:$n$$;case "boolean":return String($payload$$).toLowerCase()===
"true";case "date":return Date.now();default:return String($payload$$??"")}}catch($err$$){return Logger.error(`[${$nodeInstanceId$$}] Error parsing payload:`,$err$$),null}},$triggerDownstream$$=()=>{if($abortSignal$$.aborted)Logger.info(`[${$nodeInstanceId$$}] Aborted, skipping downstream trigger.`);else{var $currentPayload$$=$parsePayload$$();Logger.info(`[${$nodeInstanceId$$}] Injecting:`,$currentPayload$$);typeof $flowState$$.triggerDownstreamCallback==="function"?$flowState$$.triggerDownstreamCallback($node$$.id,
$currentPayload$$):Logger.error(`[${$nodeInstanceId$$}] CRITICAL: flowState.triggerDownstreamCallback is missing!`)}};if($onceAtStart$$){const $delayMs$$=(Number($interval$$)||0)*1E3;if($delayMs$$<=0){if($abortSignal$$.aborted)return Promise.reject(new DOMException("Aborted","AbortError"));Logger.info(`[${$nodeInstanceId$$}] Injecting 'once' immediately.`);return Promise.resolve($parsePayload$$())}Logger.info(`[${$nodeInstanceId$$}] Scheduling 'once' injection in ${$delayMs$$}ms.`);return new Promise(($resolve$$,
$reject$$)=>{if($abortSignal$$.aborted)return $reject$$(new DOMException("Aborted","AbortError"));setCancellableTimeout(()=>{Logger.info(`[${$nodeInstanceId$$}] Injecting 'once' after delay.`);$resolve$$($parsePayload$$())},$delayMs$$,$abortSignal$$)?$abortSignal$$.addEventListener("abort",()=>$reject$$(new DOMException("Aborted","AbortError")),{once:!0}):$reject$$(new DOMException("Aborted","AbortError"))})}if($repeat$$==="interval"){$__intervalMs_parts$$=(Number($interval$$)||1)*1E3;$interval_units$$===
"m"&&($__intervalMs_parts$$*=60);$interval_units$$==="h"&&($__intervalMs_parts$$*=3600);if($__intervalMs_parts$$>0)return Logger.info(`[${$nodeInstanceId$$}] Setting up 'interval' injection every ${$__intervalMs_parts$$}ms.`),$abortSignal$$.aborted||!setCancellableInterval($triggerDownstream$$,$__intervalMs_parts$$,$abortSignal$$)?Promise.reject(new DOMException("Aborted","AbortError")):Promise.resolve({repeating:!0,nodeType:"interval",nodeStatus:"active_repeating"});Logger.warn(`[${$nodeInstanceId$$}] Invalid interval <= 0ms. Node will not repeat.`);
return Promise.resolve()}if($repeat$$==="at"&&$at$$){$__intervalMs_parts$$=String($at$$).split(":");const $hours$$=parseInt($__intervalMs_parts$$[0],10),$minutes$$=parseInt($__intervalMs_parts$$[1],10);if(!isNaN($hours$$)&&!isNaN($minutes$$)&&$hours$$>=0&&$hours$$<24&&$minutes$$>=0&&$minutes$$<60){Logger.info(`[${$nodeInstanceId$$}] Setting up 'at' time injection daily at ${$at$$}.`);if($abortSignal$$.aborted)return Promise.reject(new DOMException("Aborted","AbortError"));const $scheduleNext$$=()=>
{if(!$abortSignal$$.aborted){var $delay$$=new Date,$targetTime$$=new Date($delay$$.getFullYear(),$delay$$.getMonth(),$delay$$.getDate(),$hours$$,$minutes$$,0,0);$targetTime$$<=$delay$$&&$targetTime$$.setDate($targetTime$$.getDate()+1);$delay$$=$targetTime$$.getTime()-$delay$$.getTime();Logger.info(`[${$nodeInstanceId$$}] Next 'at' injection scheduled in ${Math.round($delay$$/1E3)}s at ${$targetTime$$.toISOString()}`);setCancellableTimeout(()=>{$abortSignal$$.aborted||(Logger.info(`[${$nodeInstanceId$$}] Injecting 'at' time ${$at$$}.`),
$triggerDownstream$$(),$scheduleNext$$())},$delay$$,$abortSignal$$)||Logger.warn(`[${$nodeInstanceId$$}] Aborted before 'at' time timeout could be scheduled.`)}};$scheduleNext$$();return Promise.resolve({repeating:!0,nodeType:"at"})}Logger.error(`[${$nodeInstanceId$$}] Invalid 'at' time format: ${$at$$}. Node will not run.`);return Promise.reject(Error(`Invalid 'at' time format: ${$at$$}`))}Logger.info(`[${$nodeInstanceId$$}] Node configured with no action (once=${$onceAtStart$$}, repeat=${$repeat$$}).`);
return Promise.resolve()}module.exports=injectHandler;