flexbiz-server
Version:
Flexible Server
21 lines (20 loc) • 9.74 kB
JavaScript
const get=require("lodash/get");
function compareValues($actualValue$$,$operator_type$$,$compareValue_valueToCompareStr$$){switch($operator_type$$){case "isEmpty":return $actualValue$$===null||$actualValue$$===void 0||String($actualValue$$).trim()==="";case "isNotEmpty":return $actualValue$$!==null&&$actualValue$$!==void 0&&String($actualValue$$).trim()!=="";case "isType":$operator_type$$=String($compareValue_valueToCompareStr$$).toLowerCase().trim();if($operator_type$$==="null")return $actualValue$$===null;if($operator_type$$===
"undefined")return $actualValue$$===void 0;if($operator_type$$==="array")return Array.isArray($actualValue$$);if($operator_type$$==="number")return typeof $actualValue$$==="number"&&!isNaN($actualValue$$);if($operator_type$$==="string")return typeof $actualValue$$==="string";if($operator_type$$==="boolean")return typeof $actualValue$$==="boolean";if($operator_type$$==="object")return typeof $actualValue$$==="object"&&$actualValue$$!==null&&!Array.isArray($actualValue$$);Logger.warn("Switch Node: Unknown type for 'isType' operator:",
$operator_type$$);return!1;case "regex":try{return(new RegExp($compareValue_valueToCompareStr$$)).test($actualValue$$!=null?String($actualValue$$):"")}catch($e$$){return Logger.warn("Switch Node: Invalid regex:",$compareValue_valueToCompareStr$$,$e$$),!1}}$compareValue_valueToCompareStr$$=typeof $actualValue$$!=="number"||isNaN(Number($compareValue_valueToCompareStr$$))?typeof $actualValue$$==="boolean"?$compareValue_valueToCompareStr$$.toLowerCase()==="true"?!0:$compareValue_valueToCompareStr$$.toLowerCase()===
"false"?!1:$compareValue_valueToCompareStr$$:$actualValue$$===null&&$compareValue_valueToCompareStr$$==="null"?null:$actualValue$$===void 0&&$compareValue_valueToCompareStr$$==="undefined"?void 0:$compareValue_valueToCompareStr$$:Number($compareValue_valueToCompareStr$$);var $numActual_strActualForStringOps$$=String($actualValue$$??"");switch($operator_type$$){case "===":return $actualValue$$===$compareValue_valueToCompareStr$$;case "!==":return $actualValue$$!==$compareValue_valueToCompareStr$$;
case "==":return $actualValue$$==$compareValue_valueToCompareStr$$;case "!=":return $actualValue$$!=$compareValue_valueToCompareStr$$;case ">":case "<":case ">=":case "<=":$numActual_strActualForStringOps$$=Number($actualValue$$);const $numCompare$$=Number($compareValue_valueToCompareStr$$);return isNaN($numActual_strActualForStringOps$$)||isNaN($numCompare$$)?(Logger.warn(`Switch Node: Cannot perform numeric comparison for operator '${$operator_type$$}' with values:`,$actualValue$$,$compareValue_valueToCompareStr$$),
!1):$operator_type$$===">"?$numActual_strActualForStringOps$$>$numCompare$$:$operator_type$$==="<"?$numActual_strActualForStringOps$$<$numCompare$$:$operator_type$$===">="?$numActual_strActualForStringOps$$>=$numCompare$$:$numActual_strActualForStringOps$$<=$numCompare$$;case "contains":return $numActual_strActualForStringOps$$.includes(String($compareValue_valueToCompareStr$$));case "notcontains":return!$numActual_strActualForStringOps$$.includes(String($compareValue_valueToCompareStr$$));case "startsWith":return $numActual_strActualForStringOps$$.startsWith(String($compareValue_valueToCompareStr$$));
case "endsWith":return $numActual_strActualForStringOps$$.endsWith(String($compareValue_valueToCompareStr$$));default:return Logger.warn("Switch Node: Unknown or unhandled operator:",$operator_type$$),!1}}
async function switchHandler($flowState$$,$node_outgoingEdges$$,$payload$$,$abortSignal_valueToCheck$$,$engineContext_nodeLabel_propertyPath$$){const {updateNodeStatus:$updateNodeStatus$$,runNode:$runNode$$,cancelBranch:$cancelBranch$$}=$engineContext_nodeLabel_propertyPath$$;if(typeof $updateNodeStatus$$!=="function"||typeof $runNode$$!=="function"||typeof $cancelBranch$$!=="function")throw Logger.error("Switch Handler Error: Missing required engine functions (updateNodeStatus, runNode, cancelBranch) in engineContext."),
Error("Switch handler is missing required engine context functions.");const $instanceId$$=$flowState$$.instanceId,$triggerId$$=$payload$$?._triggerId||null,$triggerContext$$=$triggerId$$?`|${$triggerId$$}`:"";$engineContext_nodeLabel_propertyPath$$=$node_outgoingEdges$$.data?.name||$node_outgoingEdges$$.id||"Switch Node";const {propertyToCheck:$propertyToCheck$$,rules:$rules$$=[],stopAfterFirstMatch:$stopAfterFirstMatch$$=!0,defaultOutputHandleId:$defaultOutputHandleId$$}=$node_outgoingEdges$$.data;
Logger.info(`[${$instanceId$$}${$triggerContext$$}] ${$engineContext_nodeLabel_propertyPath$$}: Executing.`);if($abortSignal_valueToCheck$$.aborted)throw new DOMException("Aborted before switch evaluation","AbortError");if(!$propertyToCheck$$)throw Error(`Switch node (${$node_outgoingEdges$$.id}) is missing 'propertyToCheck'.`);if(!Array.isArray($rules$$))throw Error(`Switch node (${$node_outgoingEdges$$.id}) has invalid 'rules' format.`);$engineContext_nodeLabel_propertyPath$$=String($propertyToCheck$$).trim();
if($engineContext_nodeLabel_propertyPath$$==="payload")$abortSignal_valueToCheck$$=$payload$$,Logger.info(`[${$instanceId$$}${$triggerContext$$}] Checking entire payload:`,$abortSignal_valueToCheck$$);else if($engineContext_nodeLabel_propertyPath$$.startsWith("payload.")){const $actualPath$$=$engineContext_nodeLabel_propertyPath$$.substring(8);$abortSignal_valueToCheck$$=get($payload$$,$actualPath$$);Logger.warn(`[${$instanceId$$}${$triggerContext$$}] Checking property '${$actualPath$$}' within payload. Value:`,
$abortSignal_valueToCheck$$)}else $abortSignal_valueToCheck$$=get($payload$$,$engineContext_nodeLabel_propertyPath$$),Logger.warn(`[${$instanceId$$}${$triggerContext$$}] Checking direct property '${$engineContext_nodeLabel_propertyPath$$}'. Value:`,$abortSignal_valueToCheck$$);Logger.info(`[${$instanceId$$}${$triggerContext$$}] Checking property '${$propertyToCheck$$}' with value:`,$abortSignal_valueToCheck$$);const $matchedOutputHandleIds$$=new Set;for(const $rule$$ of $rules$$){const {operator:$operator$$,
valueToCompare:$valueToCompare$$,outputHandleId:$outputHandleId$$}=$rule$$;if($operator$$&&$outputHandleId$$&&String($outputHandleId$$).trim()!=="")if(compareValues($abortSignal_valueToCheck$$,$operator$$,$valueToCompare$$)){if(Logger.info(`[${$instanceId$$}${$triggerContext$$}] Rule MATCHED! Adding output handle '${$outputHandleId$$}'.`),$matchedOutputHandleIds$$.add($outputHandleId$$),$stopAfterFirstMatch$$){Logger.info(`[${$instanceId$$}${$triggerContext$$}] Stopping after first match.`);break}}else Logger.warn(`[${$instanceId$$}${$triggerContext$$}] Rule not MATCH! Adding output handle '${$outputHandleId$$}'.`,
JSON.stringify({payload:$payload$$,propertyPath:$engineContext_nodeLabel_propertyPath$$,valueToCheck:$abortSignal_valueToCheck$$,operator:$operator$$,valueToCompare:$valueToCompare$$,outputHandleId:$outputHandleId$$},null,2))}$matchedOutputHandleIds$$.size===0&&$defaultOutputHandleId$$&&String($defaultOutputHandleId$$).trim()!==""&&(Logger.info(`[${$instanceId$$}${$triggerContext$$}] No rules matched. Using default output handle '${$defaultOutputHandleId$$}'.`),$matchedOutputHandleIds$$.add($defaultOutputHandleId$$));
Logger.info(`[${$instanceId$$}${$triggerContext$$}] Final Matched Output Handles:`,Array.from($matchedOutputHandleIds$$));const $sourceNodeId$$=$node_outgoingEdges$$.id;$node_outgoingEdges$$=$flowState$$.edges.filter($edge$$=>$edge$$.source===$sourceNodeId$$);Logger.info(`[${$instanceId$$}${$triggerContext$$}] All outgoing edges from ${$sourceNodeId$$}:`,$node_outgoingEdges$$);const $edgesToFollow$$=[],$edgesToCancel$$=[];$node_outgoingEdges$$.forEach($edge$$=>{$edge$$.sourceHandle&&$matchedOutputHandleIds$$.has($edge$$.sourceHandle)?
$edgesToFollow$$.push($edge$$):$edgesToCancel$$.push($edge$$)});Logger.info(`[${$instanceId$$}${$triggerContext$$}] Edges to follow:`,$edgesToFollow$$.map($e$$=>`${$e$$.sourceHandle} -> ${$e$$.target}`));Logger.info(`[${$instanceId$$}${$triggerContext$$}] Edges to cancel:`,$edgesToCancel$$.map($e$$=>`${$e$$.sourceHandle||"no_handle"} -> ${$e$$.target}`));$edgesToFollow$$.length>0?$edgesToFollow$$.map($edge$$=>{Logger.info(`[${$instanceId$$}${$triggerContext$$}] Processing edge to target ${$edge$$.target} via handle ${$edge$$.sourceHandle}`);
const $targetNodeState$$=$flowState$$.nodes[$edge$$.target];if(!$targetNodeState$$)return Logger.warn(`[${$instanceId$$}${$triggerContext$$}] Edge target ${$edge$$.target} not found.`),Promise.resolve();Logger.info(`[${$instanceId$$}${$triggerContext$$}] ---> Attempting to set node ${$edge$$.target} to PENDING (before run)`);$updateNodeStatus$$($instanceId$$,$edge$$.target,"pending",void 0,void 0,null);Logger.info(`[${$instanceId$$}${$triggerContext$$}] Calling runNode for target ${$edge$$.target} (from handle ${$edge$$.sourceHandle})...`);
return $runNode$$($targetNodeState$$,$payload$$,$instanceId$$,$triggerId$$).catch($error$$=>{Logger.error(`[${$instanceId$$}${$triggerContext$$}] Error starting node ${$edge$$.target} from switch:`,$error$$);$updateNodeStatus$$($instanceId$$,$edge$$.target,"failed",$error$$.message||String($error$$),void 0,$triggerId$$)})}):Logger.info(`[${$instanceId$$}${$triggerContext$$}] No downstream nodes connected to matched handles.`);$edgesToCancel$$.length>0&&(Logger.info(`[${$instanceId$$}${$triggerContext$$}] Cancelling unused branches...`),
$edgesToCancel$$.map($edge$$=>{Logger.info(`[${$instanceId$$}${$triggerContext$$}] Requesting cancellation for branch starting at ${$edge$$.target} (from handle ${$edge$$.sourceHandle||"no_handle"})`);return $cancelBranch$$($instanceId$$,$edge$$.target,$triggerId$$)}),Logger.info(`[${$instanceId$$}${$triggerContext$$}] Unused branches cancellation requested.`))}module.exports=switchHandler;