namespace XFESystem.Browser; public sealed record BrowserLimits { public int MaximumHtmlCharacters { get; init; } = 1_048_576; public int MaximumScriptCharacters { get; init; } = 131_072; public int MaximumScripts { get; init; } = 32; public int MaximumExternalResourceCharacters { get; init; } = 8_388_608; public int MaximumTotalResourceCharacters { get; init; } = 33_554_432; public int MaximumExternalResources { get; init; } = 128; public int MaximumStyleCharacters { get; init; } = 2_097_152; public int MaximumStyleSheets { get; init; } = 32; public int MaximumPendingTasks { get; init; } = 1_024; public int MaximumEventCallbacksPerPump { get; init; } = 64; public int MaximumDomNodes { get; init; } = 20_000; public int MaximumDomDepth { get; init; } = 256; public int MaximumOutputCharacters { get; init; } = 65_536; public int MaximumStatements { get; init; } = 100_000; public long MaximumScriptMemoryBytes { get; init; } = 16_000_000; public int MaximumRecursionDepth { get; init; } = 64; public TimeSpan ScriptTimeout { get; init; } = TimeSpan.FromMilliseconds(500); public TimeSpan NetworkTimeout { get; init; } = TimeSpan.FromSeconds(15); public int MaximumRedirects { get; init; } = 5; internal void Validate() { if (MaximumHtmlCharacters is < 1 or > 8_388_608 || MaximumScriptCharacters is < 1 or > 8_388_608 || MaximumScripts is < 1 or > 256 || MaximumDomNodes is < 1 or > 100_000 || MaximumDomDepth is < 1 or > 512 || MaximumOutputCharacters is < 1 or > 1_048_576 || MaximumStatements is < 1 or > 100_000_000 || MaximumScriptMemoryBytes is < 100_000 or > 536_870_912 || MaximumRecursionDepth is < 1 or > 256 || ScriptTimeout <= TimeSpan.Zero || ScriptTimeout > TimeSpan.FromSeconds(60) || NetworkTimeout <= TimeSpan.Zero || NetworkTimeout > TimeSpan.FromMinutes(2) || MaximumRedirects is < 0 or > 10 || MaximumExternalResourceCharacters is < 1 or > 16_777_216 || MaximumTotalResourceCharacters is < 1 or > 67_108_864 || MaximumExternalResources is < 1 or > 512 || MaximumStyleCharacters is < 1 or > 8_388_608 || MaximumStyleSheets is < 1 or > 128 || MaximumPendingTasks is < 1 or > 8_192 || MaximumEventCallbacksPerPump is < 1 or > 1_024) throw new ArgumentOutOfRangeException(nameof(BrowserLimits), "Browser limits are outside the supported range."); } } public sealed class BrowserLimitException(string message) : Exception(message);