mirror of https://github.com/ErsatzTV/ErsatzTV.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.6 KiB
58 lines
1.6 KiB
using ErsatzTV.Core.Interfaces.Scripting; |
|
using Jint; |
|
using Microsoft.Extensions.Logging; |
|
|
|
namespace ErsatzTV.Infrastructure.Scripting; |
|
|
|
public class ScriptEngine : IScriptEngine |
|
{ |
|
private bool _disposedValue; |
|
private Engine _engine; |
|
|
|
public ScriptEngine(ILogger<ScriptEngine> logger) => |
|
_engine = new Engine( |
|
options => |
|
{ |
|
options.AllowClr(); |
|
options.LimitMemory(4_000_000); |
|
options.TimeoutInterval(TimeSpan.FromSeconds(4)); |
|
options.MaxStatements(1000); |
|
}) |
|
.SetValue("log", new Action<string>(s => logger.LogDebug("JS Script: {Message}", s))); |
|
|
|
public void Load(string jsScriptPath) |
|
{ |
|
string contents = File.ReadAllText(jsScriptPath); |
|
_engine.Execute(contents); |
|
} |
|
|
|
public async Task LoadAsync(string jsScriptPath) |
|
{ |
|
string contents = await File.ReadAllTextAsync(jsScriptPath); |
|
_engine.Execute(contents); |
|
} |
|
|
|
public object GetValue(string propertyName) => _engine.GetValue(propertyName).ToObject(); |
|
|
|
public object Invoke(string functionName, params object[] args) => _engine.Invoke(functionName, args).ToObject(); |
|
|
|
public void Dispose() |
|
{ |
|
Dispose(true); |
|
GC.SuppressFinalize(this); |
|
} |
|
|
|
protected virtual void Dispose(bool disposing) |
|
{ |
|
if (!_disposedValue) |
|
{ |
|
if (disposing) |
|
{ |
|
_engine?.Dispose(); |
|
_engine = null; |
|
} |
|
|
|
_disposedValue = true; |
|
} |
|
} |
|
}
|
|
|