From a0d587d7c033d29917de6ba27d9756402a004c90 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Mon, 29 Nov 2021 23:22:01 +0100 Subject: [PATCH] Use options for jint. --- .../Scripting/JintScriptEngine.cs | 44 +++++-------------- .../Scripting/JintScriptOptions.cs | 16 +++++++ .../Contents/ReferencesJintExtension.cs | 2 +- .../Config/Domain/InfrastructureServices.cs | 18 +++----- .../RuleEventFormatterCompareTests.cs | 14 +++--- .../HandleRules/RuleEventFormatterTests.cs | 14 +++--- .../Scripting/JintScriptEngineHelperTests.cs | 14 +++--- .../Scripting/JintScriptEngineTests.cs | 14 +++--- .../Assets/AssetsJintExtensionTests.cs | 12 ++--- .../Guards/ScriptingExtensionsTests.cs | 13 +++++- .../Comments/CommentTriggerHandlerTests.cs | 12 +++-- .../Counter/CounterJintExtensionTests.cs | 13 +++--- .../Contents/DynamicContentWorkflowTests.cs | 11 ++--- .../Contents/ReferencesJintExtensionTests.cs | 12 ++--- 14 files changed, 107 insertions(+), 102 deletions(-) create mode 100644 backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/JintScriptOptions.cs diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/JintScriptEngine.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/JintScriptEngine.cs index ad25e3fee..e6ca2c950 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/JintScriptEngine.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/JintScriptEngine.cs @@ -11,6 +11,7 @@ using Jint; using Jint.Native; using Jint.Runtime; using Microsoft.Extensions.Caching.Memory; +using Microsoft.Extensions.Options; using Squidex.Domain.Apps.Core.Contents; using Squidex.Domain.Apps.Core.Scripting.ContentWrapper; using Squidex.Domain.Apps.Core.Scripting.Internal; @@ -25,41 +26,16 @@ namespace Squidex.Domain.Apps.Core.Scripting { private readonly IJintExtension[] extensions; private readonly Parser parser; + private readonly TimeSpan timeoutScript; + private readonly TimeSpan timeoutExecution; - public TimeSpan TimeoutScript { get; set; } = TimeSpan.FromMilliseconds(200); - - public TimeSpan TimeoutExecution { get; set; } = TimeSpan.FromMilliseconds(4000); - - private TimeSpan ActualTimeoutScript - { - get - { - if (Debugger.IsAttached) - { - return TimeSpan.FromHours(1); - } - - return TimeoutScript; - } - } - - private TimeSpan ActualTimeoutExecution - { - get - { - if (Debugger.IsAttached) - { - return TimeSpan.FromHours(1); - } - - return TimeoutExecution; - } - } - - public JintScriptEngine(IMemoryCache cache, IEnumerable? extensions = null) + public JintScriptEngine(IMemoryCache cache, IOptions options, IEnumerable? extensions = null) { parser = new Parser(cache); + timeoutScript = options.Value.TimeoutScript; + timeoutExecution = options.Value.TimeoutExecution; + this.extensions = extensions?.ToArray() ?? Array.Empty(); } @@ -69,7 +45,7 @@ namespace Squidex.Domain.Apps.Core.Scripting Guard.NotNull(vars, nameof(vars)); Guard.NotNullOrEmpty(script, nameof(script)); - using (var cts = new CancellationTokenSource(ActualTimeoutExecution)) + using (var cts = new CancellationTokenSource(timeoutExecution)) { using (var combined = CancellationTokenSource.CreateLinkedTokenSource(cts.Token, ct)) { @@ -107,7 +83,7 @@ namespace Squidex.Domain.Apps.Core.Scripting Guard.NotNull(vars, nameof(vars)); Guard.NotNullOrEmpty(script, nameof(script)); - using (var cts = new CancellationTokenSource(ActualTimeoutExecution)) + using (var cts = new CancellationTokenSource(timeoutExecution)) { using (var combined = CancellationTokenSource.CreateLinkedTokenSource(cts.Token, ct)) { @@ -181,7 +157,7 @@ namespace Squidex.Domain.Apps.Core.Scripting engineOptions.AddObjectConverter(DefaultConverter.Instance); engineOptions.SetReferencesResolver(NullPropagation.Instance); engineOptions.Strict(); - engineOptions.TimeoutInterval(ActualTimeoutScript); + engineOptions.TimeoutInterval(timeoutScript); }); if (options.CanDisallow) diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/JintScriptOptions.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/JintScriptOptions.cs new file mode 100644 index 000000000..cf778749a --- /dev/null +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/JintScriptOptions.cs @@ -0,0 +1,16 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +namespace Squidex.Domain.Apps.Core.Scripting +{ + public sealed class JintScriptOptions + { + public TimeSpan TimeoutScript { get; set; } = TimeSpan.FromMilliseconds(200); + + public TimeSpan TimeoutExecution { get; set; } = TimeSpan.FromMilliseconds(4000); + } +} diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/ReferencesJintExtension.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/ReferencesJintExtension.cs index c62b4af1f..f68a409e3 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/ReferencesJintExtension.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/ReferencesJintExtension.cs @@ -95,7 +95,7 @@ namespace Squidex.Domain.Apps.Entities.Contents var contents = await contentQuery.QueryAsync(requestContext, Q.Empty.WithIds(ids), context.CancellationToken); - // Reset the time contraints and other constraints so that our awaiting does not count. + // Reset the time contraints and other constraints so that our awaiting does not count as script time. context.Engine.ResetConstraints(); callback(JsValue.FromObject(context.Engine, contents.ToArray())); diff --git a/backend/src/Squidex/Config/Domain/InfrastructureServices.cs b/backend/src/Squidex/Config/Domain/InfrastructureServices.cs index 10e724ba7..8666d75b7 100644 --- a/backend/src/Squidex/Config/Domain/InfrastructureServices.cs +++ b/backend/src/Squidex/Config/Domain/InfrastructureServices.cs @@ -47,28 +47,22 @@ namespace Squidex.Config.Domain services.Configure(config, "caching:replicated"); + services.Configure(config, + "scripting"); + services.AddReplicatedCache(); services.AddAsyncLocalCache(); services.AddBackgroundCache(); - var timeoutExecution = config.GetValue("scripting:timeoutExecution"); - var timeoutScript = config.GetValue("scripting:timeoutScript"); - - services.AddSingletonAs(c => - new JintScriptEngine( - c.GetRequiredService(), - c.GetRequiredService>()) - { - TimeoutExecution = timeoutExecution, - TimeoutScript = timeoutScript - }).As(); - services.AddSingletonAs(_ => SystemClock.Instance) .As(); services.AddSingletonAs>() .AsSelf(); + services.AddSingletonAs() + .As(); + services.AddSingletonAs() .As(); diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleEventFormatterCompareTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleEventFormatterCompareTests.cs index d1fca8ba7..851a58ed1 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleEventFormatterCompareTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleEventFormatterCompareTests.cs @@ -106,13 +106,13 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules new StringWordsJintExtension() }; - var cache = new MemoryCache(Options.Create(new MemoryCacheOptions())); - - return new JintScriptEngine(cache, extensions) - { - TimeoutScript = TimeSpan.FromSeconds(2), - TimeoutExecution = TimeSpan.FromSeconds(10) - }; + return new JintScriptEngine(new MemoryCache(Options.Create(new MemoryCacheOptions())), + Options.Create(new JintScriptOptions + { + TimeoutScript = TimeSpan.FromSeconds(2), + TimeoutExecution = TimeSpan.FromSeconds(10) + }), + extensions); } [Theory] diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleEventFormatterTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleEventFormatterTests.cs index 88d249a51..0d7f652da 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleEventFormatterTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleEventFormatterTests.cs @@ -96,13 +96,13 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules new StringWordsJintExtension() }; - var cache = new MemoryCache(Options.Create(new MemoryCacheOptions())); - - return new JintScriptEngine(cache, extensions) - { - TimeoutScript = TimeSpan.FromSeconds(2), - TimeoutExecution = TimeSpan.FromSeconds(10) - }; + return new JintScriptEngine(new MemoryCache(Options.Create(new MemoryCacheOptions())), + Options.Create(new JintScriptOptions + { + TimeoutScript = TimeSpan.FromSeconds(2), + TimeoutExecution = TimeSpan.FromSeconds(10) + }), + extensions); } [Fact] diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/JintScriptEngineHelperTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/JintScriptEngineHelperTests.cs index d234862ac..76edb64d7 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/JintScriptEngineHelperTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/JintScriptEngineHelperTests.cs @@ -35,13 +35,13 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting new StringWordsJintExtension() }; - var cache = new MemoryCache(Options.Create(new MemoryCacheOptions())); - - sut = new JintScriptEngine(cache, extensions) - { - TimeoutScript = TimeSpan.FromSeconds(2), - TimeoutExecution = TimeSpan.FromSeconds(10) - }; + sut = new JintScriptEngine(new MemoryCache(Options.Create(new MemoryCacheOptions())), + Options.Create(new JintScriptOptions + { + TimeoutScript = TimeSpan.FromSeconds(2), + TimeoutExecution = TimeSpan.FromSeconds(10) + }), + extensions); } [Fact] diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/JintScriptEngineTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/JintScriptEngineTests.cs index 0f453717c..0336ebb2a 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/JintScriptEngineTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/JintScriptEngineTests.cs @@ -52,13 +52,13 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting A.CallTo(() => httpClientFactory.CreateClient(A._)) .Returns(new HttpClient(httpHandler)); - var cache = new MemoryCache(Options.Create(new MemoryCacheOptions())); - - sut = new JintScriptEngine(cache, extensions) - { - TimeoutScript = TimeSpan.FromSeconds(2), - TimeoutExecution = TimeSpan.FromSeconds(10) - }; + sut = new JintScriptEngine(new MemoryCache(Options.Create(new MemoryCacheOptions())), + Options.Create(new JintScriptOptions + { + TimeoutScript = TimeSpan.FromSeconds(2), + TimeoutExecution = TimeSpan.FromSeconds(10) + }), + extensions); } [Fact] diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Assets/AssetsJintExtensionTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Assets/AssetsJintExtensionTests.cs index 42979b906..4606656c1 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Assets/AssetsJintExtensionTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Assets/AssetsJintExtensionTests.cs @@ -48,11 +48,13 @@ namespace Squidex.Domain.Apps.Entities.Assets A.CallTo(() => appProvider.GetAppAsync(appId.Id, false, default)) .Returns(Mocks.App(appId)); - sut = new JintScriptEngine(new MemoryCache(Options.Create(new MemoryCacheOptions())), extensions) - { - TimeoutScript = TimeSpan.FromSeconds(2), - TimeoutExecution = TimeSpan.FromSeconds(10) - }; + sut = new JintScriptEngine(new MemoryCache(Options.Create(new MemoryCacheOptions())), + Options.Create(new JintScriptOptions + { + TimeoutScript = TimeSpan.FromSeconds(2), + TimeoutExecution = TimeSpan.FromSeconds(10) + }), + extensions); } [Fact] diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Assets/DomainObject/Guards/ScriptingExtensionsTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Assets/DomainObject/Guards/ScriptingExtensionsTests.cs index e27524718..9bf81d1e1 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Assets/DomainObject/Guards/ScriptingExtensionsTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Assets/DomainObject/Guards/ScriptingExtensionsTests.cs @@ -89,10 +89,19 @@ namespace Squidex.Domain.Apps.Entities.Assets.DomainObject.Guards A.CallTo(() => app.AssetScripts) .Returns(scripts); + var scriptEngine = new JintScriptEngine(new MemoryCache(Options.Create(new MemoryCacheOptions())), + Options.Create(new JintScriptOptions + { + TimeoutScript = TimeSpan.FromSeconds(2), + TimeoutExecution = TimeSpan.FromSeconds(10) + })); + var serviceProvider = new ServiceCollection() - .AddSingleton( - new JintScriptEngine(new MemoryCache(Options.Create(new MemoryCacheOptions())))) + .AddMemoryCache() + .AddOptions() + .AddOptions().Services + .AddSingleton() .BuildServiceProvider(); command.Actor = actor; diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Comments/CommentTriggerHandlerTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Comments/CommentTriggerHandlerTests.cs index c7b422f8c..624fa84c4 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Comments/CommentTriggerHandlerTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Comments/CommentTriggerHandlerTests.cs @@ -265,9 +265,15 @@ namespace Squidex.Domain.Apps.Entities.Comments Condition = condition }; - var memoryCache = new MemoryCache(Options.Create(new MemoryCacheOptions())); - - var handler = new CommentTriggerHandler(new JintScriptEngine(memoryCache), userResolver); + var realScriptEngine = + new JintScriptEngine(new MemoryCache(Options.Create(new MemoryCacheOptions())), + Options.Create(new JintScriptOptions + { + TimeoutScript = TimeSpan.FromSeconds(2), + TimeoutExecution = TimeSpan.FromSeconds(10) + })); + + var handler = new CommentTriggerHandler(realScriptEngine, userResolver); action(handler, Context(trigger)); } diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Counter/CounterJintExtensionTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Counter/CounterJintExtensionTests.cs index 07b1ebadb..0bcf4b9e4 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Counter/CounterJintExtensionTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Counter/CounterJintExtensionTests.cs @@ -28,13 +28,12 @@ namespace Squidex.Domain.Apps.Entities.Contents.Counter new CounterJintExtension(grainFactory) }; - var cache = new MemoryCache(Options.Create(new MemoryCacheOptions())); - - sut = new JintScriptEngine(cache, extensions) - { - TimeoutScript = TimeSpan.FromSeconds(2), - TimeoutExecution = TimeSpan.FromSeconds(10) - }; + sut = new JintScriptEngine(new MemoryCache(Options.Create(new MemoryCacheOptions())), + Options.Create(new JintScriptOptions + { + TimeoutScript = TimeSpan.FromSeconds(2), + TimeoutExecution = TimeSpan.FromSeconds(10) + }), extensions); } [Fact] diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/DynamicContentWorkflowTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/DynamicContentWorkflowTests.cs index 3b531572e..4c61f40bb 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/DynamicContentWorkflowTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/DynamicContentWorkflowTests.cs @@ -90,11 +90,12 @@ namespace Squidex.Domain.Apps.Entities.Contents A.CallTo(() => app.Workflows) .Returns(workflows); - var scriptEngine = new JintScriptEngine(new MemoryCache(Options.Create(new MemoryCacheOptions()))) - { - TimeoutScript = TimeSpan.FromSeconds(2), - TimeoutExecution = TimeSpan.FromSeconds(10) - }; + var scriptEngine = new JintScriptEngine(new MemoryCache(Options.Create(new MemoryCacheOptions())), + Options.Create(new JintScriptOptions + { + TimeoutScript = TimeSpan.FromSeconds(2), + TimeoutExecution = TimeSpan.FromSeconds(10) + })); sut = new DynamicContentWorkflow(scriptEngine, appProvider); } diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ReferencesJintExtensionTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ReferencesJintExtensionTests.cs index 0af04b965..f74a7eee6 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ReferencesJintExtensionTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ReferencesJintExtensionTests.cs @@ -43,11 +43,13 @@ namespace Squidex.Domain.Apps.Entities.Contents A.CallTo(() => appProvider.GetAppAsync(appId.Id, false, default)) .Returns(Mocks.App(appId)); - sut = new JintScriptEngine(new MemoryCache(Options.Create(new MemoryCacheOptions())), extensions) - { - TimeoutScript = TimeSpan.FromSeconds(2), - TimeoutExecution = TimeSpan.FromSeconds(10) - }; + sut = new JintScriptEngine(new MemoryCache(Options.Create(new MemoryCacheOptions())), + Options.Create(new JintScriptOptions + { + TimeoutScript = TimeSpan.FromSeconds(2), + TimeoutExecution = TimeSpan.FromSeconds(10) + }), + extensions); } [Fact]