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);
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);