diff --git a/ProjectObsidian/ProtoFlux/Flow/AsyncWait.cs b/ProjectObsidian/ProtoFlux/Flow/AsyncWait.cs new file mode 100644 index 0000000..cc0eeed --- /dev/null +++ b/ProjectObsidian/ProtoFlux/Flow/AsyncWait.cs @@ -0,0 +1,46 @@ +using System; +using System.Threading.Tasks; +using ProtoFlux.Core; +using ProtoFlux.Runtimes.Execution; + +[NodeCategory("Flow/Async")] +[NodeName("Async Wait", false)] +public class AsyncWait : AsyncActionNode +{ + public ValueInput Condition; + public ValueInput Timeout; + + public AsyncCall OnStarted; + + public Continuation OnDone; + public Continuation TimedOut; + + protected override async Task RunAsync(ExecutionContext context) + { + await OnStarted.ExecuteAsync(context); + + var timeoutInSeconds = Timeout.Evaluate(context); + var startTime = DateTime.UtcNow; + + // Initial evaluation of the condition + if (Condition.Evaluate(context, defaultValue: false)) + { + return OnDone.Target; + } + + while (!Condition.Evaluate(context, defaultValue: false)) + { + if ((DateTime.UtcNow - startTime).TotalSeconds > timeoutInSeconds) + { + return TimedOut.Target; + } + + if (context.AbortExecution) + { + throw new ExecutionAbortedException(base.Runtime as IExecutionRuntime, this, TimedOut.Target, isAsync: true); + } + } + + return OnDone.Target; + } +}