public Task <bool> IsConditionMet(ChatModel chatModel, ChatFlowStep chatFlowStep, Chat_ChildRef childRef) { if (!initialized) { throw new ApplicationException("ChatScriptManager is not initialized. Call Initialize()"); } if (String.IsNullOrEmpty(childRef.Condition)) { return(Task.FromResult(true)); } ChatVariables globalFields = chatModel.CurrentState.GlobalAnswers; ChatVariables flowFields = chatModel.CurrentState.GetFlowAnswers(chatFlowStep.Flow); if (AwsUtilityMethods.IsRunningOnAWS) { AWSXRayRecorder.Instance.BeginSubsegment("Script: Evaluate Condition"); } try { //logger.DebugFormat("Script: IsConditionMet Start. '{0}'", childRef.Condition); return(Task.FromResult( RunScript <bool>((engine, globalValues, flowValues) => { var result = engine.Evaluate(childRef.Condition); if (!(result is bool)) { logger.WarnFormat("Script: IsCondition did not return true/false. Evaluating with Javascript rules. '{0}', result: '{1}'", childRef.Condition, result); } return UtilityMethods.ParseJavascriptBoolean(result); }, globalFields, flowFields, null) )); } catch (Exception ex) { if (AwsUtilityMethods.IsRunningOnAWS) { AWSXRayRecorder.Instance.AddException(ex); } logger.ErrorFormat("Script: IsConditionMet Error. '{0}' '{1}'", childRef.Condition, ex.Message); } finally { if (AwsUtilityMethods.IsRunningOnAWS) { AWSXRayRecorder.Instance.EndSubsegment(); } } return(Task.FromResult(false)); }
private void ConvertFieldsToNative(ChatVariables fields, dynamic values, bool global) { ExpandoObject eo = values; foreach (var item in eo) { if (global && IsVariableControlled(item.Key)) { continue; } fields[item.Key] = item.Value?.FromScriptValue(); } }
public Task <ErrorHandlerResult> ProcessErrorHandler(ChatModel chatModel, ChatFlowStep chatFlowStep) { if (!initialized) { throw new ApplicationException("ChatScriptManager is not initialized. Call Initialize()"); } string script = chatFlowStep.ErrorHandler; ChatVariables globalFields = chatModel.CurrentState.GlobalAnswers; ChatVariables flowFields = chatModel.CurrentState.GetFlowAnswers(chatFlowStep.Flow); if (AwsUtilityMethods.IsRunningOnAWS) { AWSXRayRecorder.Instance.BeginSubsegment("Script: Process Parser Error Handler"); } try { return(Task.FromResult( RunScript <ErrorHandlerResult>((engine, globalValues, flowValues) => { dynamic result = engine.Evaluate(script); if (result == null) { return null; } ConvertFieldsToNative(globalFields, globalValues, true); ConvertFieldsToNative(flowFields, flowValues, false); return ScriptHelpers.ConvertToType <ErrorHandlerResult>(result); }, globalFields, flowFields, null) )); } catch (Exception ex) { if (AwsUtilityMethods.IsRunningOnAWS) { AWSXRayRecorder.Instance.AddException(ex); } logger.ErrorFormat("Script: Process Parser Error Handler Error. '{0}'", ex.Message); throw; } finally { if (AwsUtilityMethods.IsRunningOnAWS) { AWSXRayRecorder.Instance.EndSubsegment(); } } }
private TResult RunScript <TResult>(Func <V8ScriptEngine, dynamic, dynamic, TResult> function, ChatVariables globalFields, ChatVariables flowFields, object functionParams) { using (var context = v8Runtime.CreateScriptEngine()) { dynamic globalValues = globalFields.FieldAnswers.ToDynamic(context); dynamic flowValues = flowFields.FieldAnswers.ToDynamic(context); ScriptHost.ScriptContext = context; ConfigureScriptEngine(context, globalValues, flowValues, functionParams); TResult result = function(context, globalValues, flowValues); //if (logger.IsDebugEnabled) // logger.DebugFormat("Script: Stats: {0}", JsonConvert.SerializeObject(context.GetRuntimeHeapInfo())); return(result); } }
public Task <object> ProcessActions(ChatModel chatModel, ChatFlowStep chatFlowStep, object functionParams, bool expectResult) { if (!initialized) { throw new ApplicationException("ChatScriptManager is not initialized. Call Initialize()"); } ChatVariables globalFields = chatModel.CurrentState.GlobalAnswers; ChatVariables flowFields = chatModel.CurrentState.GetFlowAnswers(chatFlowStep.Flow); ScriptHost.ClearProperties(); if (chatFlowStep.Actions == null) { return(Task.FromResult <object>(null)); } //logger.DebugFormat("Script: ProcessActions Start JScriptEngine. {0}:{1}", chatFlowStep.Flow, chatFlowStep.Id); object result = null; if (AwsUtilityMethods.IsRunningOnAWS) { AWSXRayRecorder.Instance.BeginSubsegment("Script: ProcessActions"); } try { return(Task.FromResult( RunScript <object>((engine, globalValues, flowValues) => { // Performance optimization for ClearScript. // If we dont want the result, we dont need to marshal the result back. chatFlowStep.Actions.ForEach(action => result = RunAction(engine, action, expectResult)); ConvertFieldsToNative(globalFields, globalValues, true); ConvertFieldsToNative(flowFields, flowValues, false); return result; }, globalFields, flowFields, functionParams) )); } catch (Exception ex) { if (AwsUtilityMethods.IsRunningOnAWS) { AWSXRayRecorder.Instance.AddException(ex); } if (ex is Microsoft.ClearScript.ScriptEngineException scriptEx) { logger.ErrorFormat("Script: ProcessActions Error. '{0}'", scriptEx.ErrorDetails); throw new ScriptException(scriptEx.ErrorDetails, ex, chatFlowStep.Flow, chatFlowStep.Id); } logger.ErrorFormat("Script: ProcessActions Error. '{0}'", ex.Message); throw; } finally { if (AwsUtilityMethods.IsRunningOnAWS) { AWSXRayRecorder.Instance.EndSubsegment(); } } }
private void UpdateV1State(ChatState state, Chat_ParseField chatParseField, ParseResult result, ChatVariables variables) { DateTime date = (DateTime)result.Answer; int offset = state.GetUserTimeZoneOffset(); variables[chatParseField.FieldName] = date.AddHours(offset).ToShortDateString(); variables[chatParseField.FieldName + "_Date"] = date; CheckIfAnswerHasPII(state, chatParseField, date.ToString(), PIIMask); }