in src/React.Core/JavaScriptEngineFactory.cs [288:344]
private static Func<IJsEngine> GetFactory(IJsEngineSwitcher jsEngineSwitcher)
{
string defaultEngineName = jsEngineSwitcher.DefaultEngineName;
if (!string.IsNullOrWhiteSpace(defaultEngineName))
{
var engineFactory = jsEngineSwitcher.EngineFactories.Get(defaultEngineName);
if (engineFactory != null)
{
return engineFactory.CreateEngine;
}
else
{
throw new ReactEngineNotFoundException(
"Could not find a factory that creates an instance of the JavaScript " +
"engine with name `" + defaultEngineName + "`.");
}
}
if (jsEngineSwitcher.EngineFactories.Count == 0)
{
throw new ReactException("No JS engines were registered. Visit https://reactjs.net/docs for more information.");
}
var exceptionMessages = new List<string>();
foreach (var engineFactory in jsEngineSwitcher.EngineFactories.GetRegisteredFactories())
{
IJsEngine engine = null;
try
{
engine = engineFactory.CreateEngine();
if (EngineIsUsable(engine))
{
// Success! Use this one.
return engineFactory.CreateEngine;
}
}
catch (JsEngineLoadException ex)
{
Trace.WriteLine(string.Format("Error initialising {0}: {1}", engineFactory, ex.Message));
exceptionMessages.Add(ex.Message);
}
catch (Exception ex)
{
Trace.WriteLine(string.Format("Error initialising {0}: {1}", engineFactory, ex));
exceptionMessages.Add(ex.ToString());
}
finally
{
if (engine != null)
{
engine.Dispose();
}
}
}
throw new ReactEngineNotFoundException("There was an error initializing the registered JS engines. " + string.Join(Environment.NewLine, exceptionMessages));
}