From f42344133839213f444c0b35dbf5e4dc924a23c6 Mon Sep 17 00:00:00 2001 From: Caleb Lloyd Date: Sun, 18 May 2025 23:44:48 -0400 Subject: [PATCH 1/5] add redis app host Signed-off-by: Caleb Lloyd --- NatsDistributedCache.sln | 17 +- README.md | 1 - util/PerfTest/PerfTest.csproj | 2 + .../PerfTest/TestProvider/BaseTestProvider.cs | 6 + .../PerfTest/TestProvider/NatsTestProvider.cs | 6 + .../TestProvider/RedisTestProvider.cs | 6 + util/PerfTest/packages.linux-x64.lock.json | 114 ++- util/PerfTest/packages.osx-arm64.lock.json | 114 ++- util/PerfTest/packages.win-x64.lock.json | 114 ++- util/RedisAppHost/Program.cs | 9 + util/RedisAppHost/RedisAppHost.csproj | 20 + .../RedisAppHost/packages.linux-x64.lock.json | 814 ++++++++++++++++++ .../RedisAppHost/packages.osx-arm64.lock.json | 814 ++++++++++++++++++ util/RedisAppHost/packages.win-x64.lock.json | 814 ++++++++++++++++++ 14 files changed, 2798 insertions(+), 53 deletions(-) create mode 100644 util/PerfTest/TestProvider/BaseTestProvider.cs create mode 100644 util/PerfTest/TestProvider/NatsTestProvider.cs create mode 100644 util/PerfTest/TestProvider/RedisTestProvider.cs create mode 100644 util/RedisAppHost/Program.cs create mode 100644 util/RedisAppHost/RedisAppHost.csproj create mode 100644 util/RedisAppHost/packages.linux-x64.lock.json create mode 100644 util/RedisAppHost/packages.osx-arm64.lock.json create mode 100644 util/RedisAppHost/packages.win-x64.lock.json diff --git a/NatsDistributedCache.sln b/NatsDistributedCache.sln index f82a3c9..962cef9 100644 --- a/NatsDistributedCache.sln +++ b/NatsDistributedCache.sln @@ -1,4 +1,4 @@ - + Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.0.31903.59 @@ -25,6 +25,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReadmeExample", "util\Readm EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NatsHybridCacheExtensions", "src\NatsHybridCacheExtensions\NatsHybridCacheExtensions.csproj", "{F95B33FB-37B3-44F4-9E10-55835A527CA3}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RedisAppHost", "util\RedisAppHost\RedisAppHost.csproj", "{384A3CF1-B87E-45FC-88A8-037C08D82DD7}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -131,6 +133,18 @@ Global {F95B33FB-37B3-44F4-9E10-55835A527CA3}.Release|x64.Build.0 = Release|Any CPU {F95B33FB-37B3-44F4-9E10-55835A527CA3}.Release|x86.ActiveCfg = Release|Any CPU {F95B33FB-37B3-44F4-9E10-55835A527CA3}.Release|x86.Build.0 = Release|Any CPU + {384A3CF1-B87E-45FC-88A8-037C08D82DD7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {384A3CF1-B87E-45FC-88A8-037C08D82DD7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {384A3CF1-B87E-45FC-88A8-037C08D82DD7}.Debug|x64.ActiveCfg = Debug|Any CPU + {384A3CF1-B87E-45FC-88A8-037C08D82DD7}.Debug|x64.Build.0 = Debug|Any CPU + {384A3CF1-B87E-45FC-88A8-037C08D82DD7}.Debug|x86.ActiveCfg = Debug|Any CPU + {384A3CF1-B87E-45FC-88A8-037C08D82DD7}.Debug|x86.Build.0 = Debug|Any CPU + {384A3CF1-B87E-45FC-88A8-037C08D82DD7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {384A3CF1-B87E-45FC-88A8-037C08D82DD7}.Release|Any CPU.Build.0 = Release|Any CPU + {384A3CF1-B87E-45FC-88A8-037C08D82DD7}.Release|x64.ActiveCfg = Release|Any CPU + {384A3CF1-B87E-45FC-88A8-037C08D82DD7}.Release|x64.Build.0 = Release|Any CPU + {384A3CF1-B87E-45FC-88A8-037C08D82DD7}.Release|x86.ActiveCfg = Release|Any CPU + {384A3CF1-B87E-45FC-88A8-037C08D82DD7}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -144,5 +158,6 @@ Global {2F8B1224-AAC1-4ABB-BFF6-35AFE1D33E29} = {55AA232E-1A1A-2839-440B-9DCB8E3B1CD6} {2F16AC9F-97A1-4362-84B4-F03C3EBC6CD6} = {55AA232E-1A1A-2839-440B-9DCB8E3B1CD6} {F95B33FB-37B3-44F4-9E10-55835A527CA3} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} + {384A3CF1-B87E-45FC-88A8-037C08D82DD7} = {55AA232E-1A1A-2839-440B-9DCB8E3B1CD6} EndGlobalSection EndGlobal diff --git a/README.md b/README.md index 6a66ec4..874799a 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,6 @@ The `CodeCargo.Nats.HybridCacheExtensions` package provides an extension method ### Install ```bash -dotnet add package CodeCargo.Nats.DistributedCache dotnet add package CodeCargo.Nats.HybridCacheExtensions dotnet add package NATS.Net ``` diff --git a/util/PerfTest/PerfTest.csproj b/util/PerfTest/PerfTest.csproj index 2a2e423..dfd7721 100644 --- a/util/PerfTest/PerfTest.csproj +++ b/util/PerfTest/PerfTest.csproj @@ -8,12 +8,14 @@ + + diff --git a/util/PerfTest/TestProvider/BaseTestProvider.cs b/util/PerfTest/TestProvider/BaseTestProvider.cs new file mode 100644 index 0000000..2aa95ac --- /dev/null +++ b/util/PerfTest/TestProvider/BaseTestProvider.cs @@ -0,0 +1,6 @@ +namespace CodeCargo.Nats.DistributedCache.PerfTest.TestProvider; + +public abstract class BaseTestProvider +{ + +} diff --git a/util/PerfTest/TestProvider/NatsTestProvider.cs b/util/PerfTest/TestProvider/NatsTestProvider.cs new file mode 100644 index 0000000..23352a3 --- /dev/null +++ b/util/PerfTest/TestProvider/NatsTestProvider.cs @@ -0,0 +1,6 @@ +namespace CodeCargo.Nats.DistributedCache.PerfTest.TestProvider; + +public class NatsTestProvider : BaseTestProvider +{ + +} diff --git a/util/PerfTest/TestProvider/RedisTestProvider.cs b/util/PerfTest/TestProvider/RedisTestProvider.cs new file mode 100644 index 0000000..3f0c9b3 --- /dev/null +++ b/util/PerfTest/TestProvider/RedisTestProvider.cs @@ -0,0 +1,6 @@ +namespace CodeCargo.Nats.DistributedCache.PerfTest.TestProvider; + +public class RedisTestProvider : BaseTestProvider +{ + +} diff --git a/util/PerfTest/packages.linux-x64.lock.json b/util/PerfTest/packages.linux-x64.lock.json index d7c855c..91602f5 100644 --- a/util/PerfTest/packages.linux-x64.lock.json +++ b/util/PerfTest/packages.linux-x64.lock.json @@ -36,6 +36,18 @@ "System.IO.Hashing": "9.0.3" } }, + "Microsoft.Extensions.Caching.StackExchangeRedis": { + "type": "Direct", + "requested": "[9.0.5, )", + "resolved": "9.0.5", + "contentHash": "bSn4ak8sjP8dfT4OoKXcUIMwodxfQhE+6eBP9HgyNFpsffSp/Tlnjn8aaB0Sqp+5l1s7XzpKiXHHbuCiiLDnTw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.5", + "Microsoft.Extensions.Logging.Abstractions": "9.0.5", + "Microsoft.Extensions.Options": "9.0.5", + "StackExchange.Redis": "2.7.27" + } + }, "NATS.Net": { "type": "Direct", "requested": "[2.6.0, )", @@ -130,6 +142,47 @@ "resolved": "9.2.1", "contentHash": "T27Rae/gvbWGmJN+RbO7Abhdp3WQUei+rCThyCxL3rZQ1eaMZzFFqb53XAiBsvvJ4vIRjNIh0RHDD4EXiOySQg==" }, + "Aspire.Hosting.Redis": { + "type": "Transitive", + "resolved": "9.2.1", + "contentHash": "t/hsyOcxp2C03eWke7it9psgSajaUBDILjW3dWzw+S7OCd7lGrLzhbXEtq0wEcQXB3vnqKqRMnMZCTmRtnZswA==", + "dependencies": { + "AspNetCore.HealthChecks.Redis": "9.0.0", + "AspNetCore.HealthChecks.Uris": "9.0.0", + "Aspire.Hosting": "9.2.1", + "Google.Protobuf": "3.30.1", + "Grpc.AspNetCore": "2.70.0", + "Grpc.Net.ClientFactory": "2.70.0", + "Grpc.Tools": "2.71.0", + "Humanizer.Core": "2.14.1", + "JsonPatch.Net": "3.3.0", + "KubernetesClient": "16.0.2", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.2", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.15", + "Microsoft.Extensions.Hosting": "8.0.1", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.1", + "Microsoft.Extensions.Http": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.3", + "Microsoft.Extensions.Options": "8.0.2", + "Microsoft.Extensions.Primitives": "8.0.0", + "Newtonsoft.Json": "13.0.3", + "Polly.Core": "8.5.2", + "StackExchange.Redis": "2.8.31", + "StreamJsonRpc": "2.21.69", + "System.IO.Hashing": "9.0.3" + } + }, + "AspNetCore.HealthChecks.Redis": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "yNH0h8GLRbAf+PU5HNVLZ5hNeyq9mDVmRKO9xuZsme/znUYoBJlQvI0gq45gaZNlLncCHkMhR4o90MuT+gxxPw==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.11", + "StackExchange.Redis": "2.7.4" + } + }, "AspNetCore.HealthChecks.Uris": { "type": "Transitive", "resolved": "9.0.0", @@ -295,10 +348,10 @@ }, "Microsoft.Extensions.Caching.Abstractions": { "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "imcZ5BGhBw5mNsWLepBbqqumWaFe0GtvyCvne2/2wsDIBRa2+Lhx4cU/pKt/4BwOizzUEOls2k1eOJQXHGMalg==", + "resolved": "9.0.5", + "contentHash": "RV6wOTvH5BeVRs6cvxFuaV1ut05Dklpvq19XRO1JxAayfLWYIEP7K94aamY0iSUhoehWk1X5H6gMcbZkHuBjew==", "dependencies": { - "Microsoft.Extensions.Primitives": "9.0.4" + "Microsoft.Extensions.Primitives": "9.0.5" } }, "Microsoft.Extensions.Caching.Hybrid": { @@ -420,8 +473,8 @@ }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "UI0TQPVkS78bFdjkTodmkH0Fe8lXv9LnhGFKgKrsgUJ5a5FVdFRcgjIkBVLbGgdRhxWirxH/8IXUtEyYJx6GQg==" + "resolved": "9.0.5", + "contentHash": "cjnRtsEAzU73aN6W7vkWy8Phj5t3Xm78HSqgrbh/O4Q9SK/yN73wZVa21QQY6amSLQRQ/M8N+koGnY6PuvKQsw==" }, "Microsoft.Extensions.DependencyInjection.AutoActivation": { "type": "Transitive", @@ -586,11 +639,11 @@ }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "0MXlimU4Dud6t+iNi5NEz3dO2w1HXdhoOLaYFuLPCjAsvlPQGwOT6V2KZRMLEhCAm/stSZt1AUv0XmDdkjvtbw==", + "resolved": "9.0.5", + "contentHash": "pP1PADCrIxMYJXxFmTVbAgEU7GVpjK5i0/tyfU9DiE0oXQy3JWQaOVgCkrCiePLgS8b5sghM3Fau3EeHiVWbCg==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", - "System.Diagnostics.DiagnosticSource": "9.0.4" + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", + "System.Diagnostics.DiagnosticSource": "9.0.5" } }, "Microsoft.Extensions.Logging.Configuration": { @@ -661,11 +714,11 @@ }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "fiFI2+58kicqVZyt/6obqoFwHiab7LC4FkQ3mmiBJ28Yy4fAvy2+v9MRnSvvlOO8chTOjKsdafFl/K9veCPo5g==", + "resolved": "9.0.5", + "contentHash": "vPdJQU8YLOUSSK8NL0RmwcXJr2E0w8xH559PGQl4JYsglgilZr9LZnqV2zdgk+XR05+kuvhBEZKoDVd46o7NqA==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", - "Microsoft.Extensions.Primitives": "9.0.4" + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", + "Microsoft.Extensions.Primitives": "9.0.5" } }, "Microsoft.Extensions.Options.ConfigurationExtensions": { @@ -682,8 +735,8 @@ }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "SPFyMjyku1nqTFFJ928JAMd0QnRe4xjE7KeKnZMWXf3xk+6e0WiOZAluYtLdbJUXtsl2cCRSi8cBquJ408k8RA==" + "resolved": "9.0.5", + "contentHash": "b4OAv1qE1C9aM+ShWJu3rlo/WjDwa/I30aIPXqDWSKXTtKl1Wwh6BZn+glH5HndGVVn3C6ZAPQj5nv7/7HJNBQ==" }, "Microsoft.Extensions.Resilience": { "type": "Transitive", @@ -854,6 +907,14 @@ "resolved": "13.0.3", "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" }, + "Pipelines.Sockets.Unofficial": { + "type": "Transitive", + "resolved": "2.2.8", + "contentHash": "zG2FApP5zxSx6OcdJQLbZDk2AVlN2BNQD6MorwIfV6gVj0RRxWPEp2LXAxqDGZqeNV1Zp0BNPcNaey/GXmTdvQ==", + "dependencies": { + "System.IO.Pipelines": "5.0.1" + } + }, "Polly.Core": { "type": "Transitive", "resolved": "8.5.2", @@ -878,6 +939,15 @@ "System.Threading.RateLimiting": "8.0.0" } }, + "StackExchange.Redis": { + "type": "Transitive", + "resolved": "2.8.31", + "contentHash": "RCHVQa9Zke8k0oBgJn1Yl6BuYy8i6kv+sdMObiH60nOwD6QvWAjxdDwOm+LO78E8WsGiPqgOuItkz98fPS6haQ==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Pipelines.Sockets.Unofficial": "2.2.8" + } + }, "StreamJsonRpc": { "type": "Transitive", "resolved": "2.21.69", @@ -899,8 +969,8 @@ }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "Be0emq8bRmcK4eeJIFUt9+vYPf7kzuQrFs8Ef1CdGvXpq/uSve22PTSkRF09bF/J7wmYJ2DHf2v7GaT3vMXnwQ==" + "resolved": "9.0.5", + "contentHash": "WoI5or8kY2VxFdDmsaRZ5yaYvvb+4MCyy66eXo79Cy1uMa7qXeGIlYmZx7R9Zy5S4xZjmqvkk2V8L6/vDwAAEA==" }, "System.Diagnostics.EventLog": { "type": "Transitive", @@ -992,6 +1062,16 @@ "CodeCargo.Nats.HybridCacheExtensions": "[1.0.0, )" } }, + "redisapphost": { + "type": "Project", + "dependencies": { + "Aspire.Dashboard.Sdk.linux-x64": "[9.2.1, )", + "Aspire.Hosting.AppHost": "[9.2.1, )", + "Aspire.Hosting.Orchestration.linux-x64": "[9.2.1, )", + "Aspire.Hosting.Redis": "[9.2.1, )", + "CodeCargo.Nats.HybridCacheExtensions": "[1.0.0, )" + } + }, "testutils": { "type": "Project", "dependencies": { diff --git a/util/PerfTest/packages.osx-arm64.lock.json b/util/PerfTest/packages.osx-arm64.lock.json index 3aed346..25a02ee 100644 --- a/util/PerfTest/packages.osx-arm64.lock.json +++ b/util/PerfTest/packages.osx-arm64.lock.json @@ -36,6 +36,18 @@ "System.IO.Hashing": "9.0.3" } }, + "Microsoft.Extensions.Caching.StackExchangeRedis": { + "type": "Direct", + "requested": "[9.0.5, )", + "resolved": "9.0.5", + "contentHash": "bSn4ak8sjP8dfT4OoKXcUIMwodxfQhE+6eBP9HgyNFpsffSp/Tlnjn8aaB0Sqp+5l1s7XzpKiXHHbuCiiLDnTw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.5", + "Microsoft.Extensions.Logging.Abstractions": "9.0.5", + "Microsoft.Extensions.Options": "9.0.5", + "StackExchange.Redis": "2.7.27" + } + }, "NATS.Net": { "type": "Direct", "requested": "[2.6.0, )", @@ -130,6 +142,47 @@ "resolved": "9.2.1", "contentHash": "A6gbrMq04234e4kbaEQzvRblaA+vmzddYlQu97B8jVnPzldTboFS68Fc4TCgpiRnBThAsReeJvgTqhtZgwlYZQ==" }, + "Aspire.Hosting.Redis": { + "type": "Transitive", + "resolved": "9.2.1", + "contentHash": "t/hsyOcxp2C03eWke7it9psgSajaUBDILjW3dWzw+S7OCd7lGrLzhbXEtq0wEcQXB3vnqKqRMnMZCTmRtnZswA==", + "dependencies": { + "AspNetCore.HealthChecks.Redis": "9.0.0", + "AspNetCore.HealthChecks.Uris": "9.0.0", + "Aspire.Hosting": "9.2.1", + "Google.Protobuf": "3.30.1", + "Grpc.AspNetCore": "2.70.0", + "Grpc.Net.ClientFactory": "2.70.0", + "Grpc.Tools": "2.71.0", + "Humanizer.Core": "2.14.1", + "JsonPatch.Net": "3.3.0", + "KubernetesClient": "16.0.2", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.2", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.15", + "Microsoft.Extensions.Hosting": "8.0.1", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.1", + "Microsoft.Extensions.Http": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.3", + "Microsoft.Extensions.Options": "8.0.2", + "Microsoft.Extensions.Primitives": "8.0.0", + "Newtonsoft.Json": "13.0.3", + "Polly.Core": "8.5.2", + "StackExchange.Redis": "2.8.31", + "StreamJsonRpc": "2.21.69", + "System.IO.Hashing": "9.0.3" + } + }, + "AspNetCore.HealthChecks.Redis": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "yNH0h8GLRbAf+PU5HNVLZ5hNeyq9mDVmRKO9xuZsme/znUYoBJlQvI0gq45gaZNlLncCHkMhR4o90MuT+gxxPw==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.11", + "StackExchange.Redis": "2.7.4" + } + }, "AspNetCore.HealthChecks.Uris": { "type": "Transitive", "resolved": "9.0.0", @@ -295,10 +348,10 @@ }, "Microsoft.Extensions.Caching.Abstractions": { "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "imcZ5BGhBw5mNsWLepBbqqumWaFe0GtvyCvne2/2wsDIBRa2+Lhx4cU/pKt/4BwOizzUEOls2k1eOJQXHGMalg==", + "resolved": "9.0.5", + "contentHash": "RV6wOTvH5BeVRs6cvxFuaV1ut05Dklpvq19XRO1JxAayfLWYIEP7K94aamY0iSUhoehWk1X5H6gMcbZkHuBjew==", "dependencies": { - "Microsoft.Extensions.Primitives": "9.0.4" + "Microsoft.Extensions.Primitives": "9.0.5" } }, "Microsoft.Extensions.Caching.Hybrid": { @@ -420,8 +473,8 @@ }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "UI0TQPVkS78bFdjkTodmkH0Fe8lXv9LnhGFKgKrsgUJ5a5FVdFRcgjIkBVLbGgdRhxWirxH/8IXUtEyYJx6GQg==" + "resolved": "9.0.5", + "contentHash": "cjnRtsEAzU73aN6W7vkWy8Phj5t3Xm78HSqgrbh/O4Q9SK/yN73wZVa21QQY6amSLQRQ/M8N+koGnY6PuvKQsw==" }, "Microsoft.Extensions.DependencyInjection.AutoActivation": { "type": "Transitive", @@ -586,11 +639,11 @@ }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "0MXlimU4Dud6t+iNi5NEz3dO2w1HXdhoOLaYFuLPCjAsvlPQGwOT6V2KZRMLEhCAm/stSZt1AUv0XmDdkjvtbw==", + "resolved": "9.0.5", + "contentHash": "pP1PADCrIxMYJXxFmTVbAgEU7GVpjK5i0/tyfU9DiE0oXQy3JWQaOVgCkrCiePLgS8b5sghM3Fau3EeHiVWbCg==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", - "System.Diagnostics.DiagnosticSource": "9.0.4" + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", + "System.Diagnostics.DiagnosticSource": "9.0.5" } }, "Microsoft.Extensions.Logging.Configuration": { @@ -661,11 +714,11 @@ }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "fiFI2+58kicqVZyt/6obqoFwHiab7LC4FkQ3mmiBJ28Yy4fAvy2+v9MRnSvvlOO8chTOjKsdafFl/K9veCPo5g==", + "resolved": "9.0.5", + "contentHash": "vPdJQU8YLOUSSK8NL0RmwcXJr2E0w8xH559PGQl4JYsglgilZr9LZnqV2zdgk+XR05+kuvhBEZKoDVd46o7NqA==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", - "Microsoft.Extensions.Primitives": "9.0.4" + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", + "Microsoft.Extensions.Primitives": "9.0.5" } }, "Microsoft.Extensions.Options.ConfigurationExtensions": { @@ -682,8 +735,8 @@ }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "SPFyMjyku1nqTFFJ928JAMd0QnRe4xjE7KeKnZMWXf3xk+6e0WiOZAluYtLdbJUXtsl2cCRSi8cBquJ408k8RA==" + "resolved": "9.0.5", + "contentHash": "b4OAv1qE1C9aM+ShWJu3rlo/WjDwa/I30aIPXqDWSKXTtKl1Wwh6BZn+glH5HndGVVn3C6ZAPQj5nv7/7HJNBQ==" }, "Microsoft.Extensions.Resilience": { "type": "Transitive", @@ -854,6 +907,14 @@ "resolved": "13.0.3", "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" }, + "Pipelines.Sockets.Unofficial": { + "type": "Transitive", + "resolved": "2.2.8", + "contentHash": "zG2FApP5zxSx6OcdJQLbZDk2AVlN2BNQD6MorwIfV6gVj0RRxWPEp2LXAxqDGZqeNV1Zp0BNPcNaey/GXmTdvQ==", + "dependencies": { + "System.IO.Pipelines": "5.0.1" + } + }, "Polly.Core": { "type": "Transitive", "resolved": "8.5.2", @@ -878,6 +939,15 @@ "System.Threading.RateLimiting": "8.0.0" } }, + "StackExchange.Redis": { + "type": "Transitive", + "resolved": "2.8.31", + "contentHash": "RCHVQa9Zke8k0oBgJn1Yl6BuYy8i6kv+sdMObiH60nOwD6QvWAjxdDwOm+LO78E8WsGiPqgOuItkz98fPS6haQ==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Pipelines.Sockets.Unofficial": "2.2.8" + } + }, "StreamJsonRpc": { "type": "Transitive", "resolved": "2.21.69", @@ -899,8 +969,8 @@ }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "Be0emq8bRmcK4eeJIFUt9+vYPf7kzuQrFs8Ef1CdGvXpq/uSve22PTSkRF09bF/J7wmYJ2DHf2v7GaT3vMXnwQ==" + "resolved": "9.0.5", + "contentHash": "WoI5or8kY2VxFdDmsaRZ5yaYvvb+4MCyy66eXo79Cy1uMa7qXeGIlYmZx7R9Zy5S4xZjmqvkk2V8L6/vDwAAEA==" }, "System.Diagnostics.EventLog": { "type": "Transitive", @@ -992,6 +1062,16 @@ "CodeCargo.Nats.HybridCacheExtensions": "[1.0.0, )" } }, + "redisapphost": { + "type": "Project", + "dependencies": { + "Aspire.Dashboard.Sdk.osx-arm64": "[9.2.1, )", + "Aspire.Hosting.AppHost": "[9.2.1, )", + "Aspire.Hosting.Orchestration.osx-arm64": "[9.2.1, )", + "Aspire.Hosting.Redis": "[9.2.1, )", + "CodeCargo.Nats.HybridCacheExtensions": "[1.0.0, )" + } + }, "testutils": { "type": "Project", "dependencies": { diff --git a/util/PerfTest/packages.win-x64.lock.json b/util/PerfTest/packages.win-x64.lock.json index 7e2c019..40db5e2 100644 --- a/util/PerfTest/packages.win-x64.lock.json +++ b/util/PerfTest/packages.win-x64.lock.json @@ -36,6 +36,18 @@ "System.IO.Hashing": "9.0.3" } }, + "Microsoft.Extensions.Caching.StackExchangeRedis": { + "type": "Direct", + "requested": "[9.0.5, )", + "resolved": "9.0.5", + "contentHash": "bSn4ak8sjP8dfT4OoKXcUIMwodxfQhE+6eBP9HgyNFpsffSp/Tlnjn8aaB0Sqp+5l1s7XzpKiXHHbuCiiLDnTw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.5", + "Microsoft.Extensions.Logging.Abstractions": "9.0.5", + "Microsoft.Extensions.Options": "9.0.5", + "StackExchange.Redis": "2.7.27" + } + }, "NATS.Net": { "type": "Direct", "requested": "[2.6.0, )", @@ -130,6 +142,47 @@ "resolved": "9.2.1", "contentHash": "zql5k3nKMwCBfpODLt/sy/nKsZM272+LV67e3ehv9Ec2+0mUuPRs2DGx9mzvh7sBYBq53pF7A7pn9E3V6FkOXw==" }, + "Aspire.Hosting.Redis": { + "type": "Transitive", + "resolved": "9.2.1", + "contentHash": "t/hsyOcxp2C03eWke7it9psgSajaUBDILjW3dWzw+S7OCd7lGrLzhbXEtq0wEcQXB3vnqKqRMnMZCTmRtnZswA==", + "dependencies": { + "AspNetCore.HealthChecks.Redis": "9.0.0", + "AspNetCore.HealthChecks.Uris": "9.0.0", + "Aspire.Hosting": "9.2.1", + "Google.Protobuf": "3.30.1", + "Grpc.AspNetCore": "2.70.0", + "Grpc.Net.ClientFactory": "2.70.0", + "Grpc.Tools": "2.71.0", + "Humanizer.Core": "2.14.1", + "JsonPatch.Net": "3.3.0", + "KubernetesClient": "16.0.2", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.2", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.15", + "Microsoft.Extensions.Hosting": "8.0.1", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.1", + "Microsoft.Extensions.Http": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.3", + "Microsoft.Extensions.Options": "8.0.2", + "Microsoft.Extensions.Primitives": "8.0.0", + "Newtonsoft.Json": "13.0.3", + "Polly.Core": "8.5.2", + "StackExchange.Redis": "2.8.31", + "StreamJsonRpc": "2.21.69", + "System.IO.Hashing": "9.0.3" + } + }, + "AspNetCore.HealthChecks.Redis": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "yNH0h8GLRbAf+PU5HNVLZ5hNeyq9mDVmRKO9xuZsme/znUYoBJlQvI0gq45gaZNlLncCHkMhR4o90MuT+gxxPw==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.11", + "StackExchange.Redis": "2.7.4" + } + }, "AspNetCore.HealthChecks.Uris": { "type": "Transitive", "resolved": "9.0.0", @@ -295,10 +348,10 @@ }, "Microsoft.Extensions.Caching.Abstractions": { "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "imcZ5BGhBw5mNsWLepBbqqumWaFe0GtvyCvne2/2wsDIBRa2+Lhx4cU/pKt/4BwOizzUEOls2k1eOJQXHGMalg==", + "resolved": "9.0.5", + "contentHash": "RV6wOTvH5BeVRs6cvxFuaV1ut05Dklpvq19XRO1JxAayfLWYIEP7K94aamY0iSUhoehWk1X5H6gMcbZkHuBjew==", "dependencies": { - "Microsoft.Extensions.Primitives": "9.0.4" + "Microsoft.Extensions.Primitives": "9.0.5" } }, "Microsoft.Extensions.Caching.Hybrid": { @@ -420,8 +473,8 @@ }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "UI0TQPVkS78bFdjkTodmkH0Fe8lXv9LnhGFKgKrsgUJ5a5FVdFRcgjIkBVLbGgdRhxWirxH/8IXUtEyYJx6GQg==" + "resolved": "9.0.5", + "contentHash": "cjnRtsEAzU73aN6W7vkWy8Phj5t3Xm78HSqgrbh/O4Q9SK/yN73wZVa21QQY6amSLQRQ/M8N+koGnY6PuvKQsw==" }, "Microsoft.Extensions.DependencyInjection.AutoActivation": { "type": "Transitive", @@ -586,11 +639,11 @@ }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "0MXlimU4Dud6t+iNi5NEz3dO2w1HXdhoOLaYFuLPCjAsvlPQGwOT6V2KZRMLEhCAm/stSZt1AUv0XmDdkjvtbw==", + "resolved": "9.0.5", + "contentHash": "pP1PADCrIxMYJXxFmTVbAgEU7GVpjK5i0/tyfU9DiE0oXQy3JWQaOVgCkrCiePLgS8b5sghM3Fau3EeHiVWbCg==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", - "System.Diagnostics.DiagnosticSource": "9.0.4" + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", + "System.Diagnostics.DiagnosticSource": "9.0.5" } }, "Microsoft.Extensions.Logging.Configuration": { @@ -661,11 +714,11 @@ }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "fiFI2+58kicqVZyt/6obqoFwHiab7LC4FkQ3mmiBJ28Yy4fAvy2+v9MRnSvvlOO8chTOjKsdafFl/K9veCPo5g==", + "resolved": "9.0.5", + "contentHash": "vPdJQU8YLOUSSK8NL0RmwcXJr2E0w8xH559PGQl4JYsglgilZr9LZnqV2zdgk+XR05+kuvhBEZKoDVd46o7NqA==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", - "Microsoft.Extensions.Primitives": "9.0.4" + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", + "Microsoft.Extensions.Primitives": "9.0.5" } }, "Microsoft.Extensions.Options.ConfigurationExtensions": { @@ -682,8 +735,8 @@ }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "SPFyMjyku1nqTFFJ928JAMd0QnRe4xjE7KeKnZMWXf3xk+6e0WiOZAluYtLdbJUXtsl2cCRSi8cBquJ408k8RA==" + "resolved": "9.0.5", + "contentHash": "b4OAv1qE1C9aM+ShWJu3rlo/WjDwa/I30aIPXqDWSKXTtKl1Wwh6BZn+glH5HndGVVn3C6ZAPQj5nv7/7HJNBQ==" }, "Microsoft.Extensions.Resilience": { "type": "Transitive", @@ -854,6 +907,14 @@ "resolved": "13.0.3", "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" }, + "Pipelines.Sockets.Unofficial": { + "type": "Transitive", + "resolved": "2.2.8", + "contentHash": "zG2FApP5zxSx6OcdJQLbZDk2AVlN2BNQD6MorwIfV6gVj0RRxWPEp2LXAxqDGZqeNV1Zp0BNPcNaey/GXmTdvQ==", + "dependencies": { + "System.IO.Pipelines": "5.0.1" + } + }, "Polly.Core": { "type": "Transitive", "resolved": "8.5.2", @@ -878,6 +939,15 @@ "System.Threading.RateLimiting": "8.0.0" } }, + "StackExchange.Redis": { + "type": "Transitive", + "resolved": "2.8.31", + "contentHash": "RCHVQa9Zke8k0oBgJn1Yl6BuYy8i6kv+sdMObiH60nOwD6QvWAjxdDwOm+LO78E8WsGiPqgOuItkz98fPS6haQ==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Pipelines.Sockets.Unofficial": "2.2.8" + } + }, "StreamJsonRpc": { "type": "Transitive", "resolved": "2.21.69", @@ -899,8 +969,8 @@ }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "Be0emq8bRmcK4eeJIFUt9+vYPf7kzuQrFs8Ef1CdGvXpq/uSve22PTSkRF09bF/J7wmYJ2DHf2v7GaT3vMXnwQ==" + "resolved": "9.0.5", + "contentHash": "WoI5or8kY2VxFdDmsaRZ5yaYvvb+4MCyy66eXo79Cy1uMa7qXeGIlYmZx7R9Zy5S4xZjmqvkk2V8L6/vDwAAEA==" }, "System.Diagnostics.EventLog": { "type": "Transitive", @@ -992,6 +1062,16 @@ "CodeCargo.Nats.HybridCacheExtensions": "[1.0.0, )" } }, + "redisapphost": { + "type": "Project", + "dependencies": { + "Aspire.Dashboard.Sdk.win-x64": "[9.2.1, )", + "Aspire.Hosting.AppHost": "[9.2.1, )", + "Aspire.Hosting.Orchestration.win-x64": "[9.2.1, )", + "Aspire.Hosting.Redis": "[9.2.1, )", + "CodeCargo.Nats.HybridCacheExtensions": "[1.0.0, )" + } + }, "testutils": { "type": "Project", "dependencies": { diff --git a/util/RedisAppHost/Program.cs b/util/RedisAppHost/Program.cs new file mode 100644 index 0000000..4c062a9 --- /dev/null +++ b/util/RedisAppHost/Program.cs @@ -0,0 +1,9 @@ +var builder = DistributedApplication.CreateBuilder(args); + +// Redis container configuration +builder.AddRedis("Redis") + .WithImage("redis") + .WithImageTag("8.0.1") + .WithEndpoint(port: 16379, targetPort: 6379, name: "redis", scheme: "tcp"); + +builder.Build().Run(); diff --git a/util/RedisAppHost/RedisAppHost.csproj b/util/RedisAppHost/RedisAppHost.csproj new file mode 100644 index 0000000..67c20da --- /dev/null +++ b/util/RedisAppHost/RedisAppHost.csproj @@ -0,0 +1,20 @@ + + + + + + true + Exe + CodeCargo.Nats.DistributedCache.RedisAppHost + + + + + + + + + + + + diff --git a/util/RedisAppHost/packages.linux-x64.lock.json b/util/RedisAppHost/packages.linux-x64.lock.json new file mode 100644 index 0000000..421773e --- /dev/null +++ b/util/RedisAppHost/packages.linux-x64.lock.json @@ -0,0 +1,814 @@ +{ + "version": 1, + "dependencies": { + "net8.0": { + "Aspire.Dashboard.Sdk.linux-x64": { + "type": "Direct", + "requested": "[9.2.1, )", + "resolved": "9.2.1", + "contentHash": "Lvl58zxyk/Id2uGrgOW3b7czkaZYa/Psje8Cen9zpgdrLZaMwJIh3g/EajqXeis0AVcLB7Hvq9eHc+t/eQ0aFA==" + }, + "Aspire.Hosting.AppHost": { + "type": "Direct", + "requested": "[9.2.1, )", + "resolved": "9.2.1", + "contentHash": "fnJKXvMD82ma7nEug+b9BZq0zUcyD+TJZei+f7BWkfRrTKznch56P2hNWmQHCRG0ZicTB6SbKuRtVa3i7uFf1Q==", + "dependencies": { + "AspNetCore.HealthChecks.Uris": "9.0.0", + "Aspire.Hosting": "9.2.1", + "Google.Protobuf": "3.30.1", + "Grpc.AspNetCore": "2.70.0", + "Grpc.Net.ClientFactory": "2.70.0", + "Grpc.Tools": "2.71.0", + "Humanizer.Core": "2.14.1", + "JsonPatch.Net": "3.3.0", + "KubernetesClient": "16.0.2", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.2", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.15", + "Microsoft.Extensions.Hosting": "8.0.1", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.1", + "Microsoft.Extensions.Http": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.3", + "Microsoft.Extensions.Options": "8.0.2", + "Microsoft.Extensions.Primitives": "8.0.0", + "Newtonsoft.Json": "13.0.3", + "Polly.Core": "8.5.2", + "StreamJsonRpc": "2.21.69", + "System.IO.Hashing": "9.0.3" + } + }, + "Aspire.Hosting.Orchestration.linux-x64": { + "type": "Direct", + "requested": "[9.2.1, )", + "resolved": "9.2.1", + "contentHash": "T27Rae/gvbWGmJN+RbO7Abhdp3WQUei+rCThyCxL3rZQ1eaMZzFFqb53XAiBsvvJ4vIRjNIh0RHDD4EXiOySQg==" + }, + "Aspire.Hosting.Redis": { + "type": "Direct", + "requested": "[9.2.1, )", + "resolved": "9.2.1", + "contentHash": "t/hsyOcxp2C03eWke7it9psgSajaUBDILjW3dWzw+S7OCd7lGrLzhbXEtq0wEcQXB3vnqKqRMnMZCTmRtnZswA==", + "dependencies": { + "AspNetCore.HealthChecks.Redis": "9.0.0", + "AspNetCore.HealthChecks.Uris": "9.0.0", + "Aspire.Hosting": "9.2.1", + "Google.Protobuf": "3.30.1", + "Grpc.AspNetCore": "2.70.0", + "Grpc.Net.ClientFactory": "2.70.0", + "Grpc.Tools": "2.71.0", + "Humanizer.Core": "2.14.1", + "JsonPatch.Net": "3.3.0", + "KubernetesClient": "16.0.2", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.2", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.15", + "Microsoft.Extensions.Hosting": "8.0.1", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.1", + "Microsoft.Extensions.Http": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.3", + "Microsoft.Extensions.Options": "8.0.2", + "Microsoft.Extensions.Primitives": "8.0.0", + "Newtonsoft.Json": "13.0.3", + "Polly.Core": "8.5.2", + "StackExchange.Redis": "2.8.31", + "StreamJsonRpc": "2.21.69", + "System.IO.Hashing": "9.0.3" + } + }, + "StyleCop.Analyzers": { + "type": "Direct", + "requested": "[1.2.0-beta.556, )", + "resolved": "1.2.0-beta.556", + "contentHash": "llRPgmA1fhC0I0QyFLEcjvtM2239QzKr/tcnbsjArLMJxJlu0AA5G7Fft0OI30pHF3MW63Gf4aSSsjc5m82J1Q==", + "dependencies": { + "StyleCop.Analyzers.Unstable": "1.2.0.556" + } + }, + "Aspire.Hosting": { + "type": "Transitive", + "resolved": "9.2.1", + "contentHash": "Awidk6C7nris+LT3Yq48oihv5uVbGmP/4rpO1sLxvxwuxSXEnPkrB2MTGCCqr3Z/e68u9J54s6p8RBdIYwTe0w==", + "dependencies": { + "AspNetCore.HealthChecks.Uris": "9.0.0", + "Google.Protobuf": "3.30.1", + "Grpc.AspNetCore": "2.70.0", + "Grpc.Net.ClientFactory": "2.70.0", + "Grpc.Tools": "2.71.0", + "Humanizer.Core": "2.14.1", + "JsonPatch.Net": "3.3.0", + "KubernetesClient": "16.0.2", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.2", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.15", + "Microsoft.Extensions.Hosting": "8.0.1", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.1", + "Microsoft.Extensions.Http": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.3", + "Microsoft.Extensions.Options": "8.0.2", + "Microsoft.Extensions.Primitives": "8.0.0", + "Newtonsoft.Json": "13.0.3", + "Polly.Core": "8.5.2", + "StreamJsonRpc": "2.21.69", + "System.IO.Hashing": "9.0.3" + } + }, + "AspNetCore.HealthChecks.Redis": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "yNH0h8GLRbAf+PU5HNVLZ5hNeyq9mDVmRKO9xuZsme/znUYoBJlQvI0gq45gaZNlLncCHkMhR4o90MuT+gxxPw==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.11", + "StackExchange.Redis": "2.7.4" + } + }, + "AspNetCore.HealthChecks.Uris": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "XYdNlA437KeF8p9qOpZFyNqAN+c0FXt/JjTvzH/Qans0q0O3pPE8KPnn39ucQQjR/Roum1vLTP3kXiUs8VHyuA==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.11", + "Microsoft.Extensions.Http": "8.0.0" + } + }, + "Fractions": { + "type": "Transitive", + "resolved": "7.3.0", + "contentHash": "2bETFWLBc8b7Ut2SVi+bxhGVwiSpknHYGBh2PADyGWONLkTxT7bKyDRhF8ao+XUv90tq8Fl7GTPxSI5bacIRJw==" + }, + "Google.Protobuf": { + "type": "Transitive", + "resolved": "3.30.1", + "contentHash": "HeWXDQBabQn/sCGicbeLJ0HMunknfC4FdLrOQOsaMJHcpqx3HVIpyyJqTrqJlWnza870twhOb+rBcaTiC/TlNA==" + }, + "Grpc.AspNetCore": { + "type": "Transitive", + "resolved": "2.70.0", + "contentHash": "s29ST5F2/PZLzOnfqfeDn0emAZajBtYnV9G7hkbK8Eu9+XphoL3KfiEsg2eBsx7P9YYQXcksDbE+CbHApMZeJA==", + "dependencies": { + "Google.Protobuf": "3.27.0", + "Grpc.AspNetCore.Server.ClientFactory": "2.70.0", + "Grpc.Tools": "2.70.0" + } + }, + "Grpc.AspNetCore.Server": { + "type": "Transitive", + "resolved": "2.70.0", + "contentHash": "9d6JuMLSxwOX4zERV7HBwq1XL8DD48a6FSoxD5dDXrCz/o0HqMXE2+lRcXHckOlz1JCesznW8XMMJdsU1FfY7w==", + "dependencies": { + "Grpc.Net.Common": "2.70.0" + } + }, + "Grpc.AspNetCore.Server.ClientFactory": { + "type": "Transitive", + "resolved": "2.70.0", + "contentHash": "k4GrvUAgVWm7DyhnV55MHdX4bQSpZVEQmlZO3bdSmGZ+z6Hx+CwDlhqiReczCm6qbzSUbS1YW0t7z7UEObTwKA==", + "dependencies": { + "Grpc.AspNetCore.Server": "2.70.0", + "Grpc.Net.ClientFactory": "2.70.0" + } + }, + "Grpc.Core.Api": { + "type": "Transitive", + "resolved": "2.70.0", + "contentHash": "66UotvWcSIq41oiQhLWcQACyKPM4umxXNiht5DQTLZJfNwEswWOcS7Z0xIEHyNIBE7ZpjotH22bEjTkvhPxmVw==" + }, + "Grpc.Net.Client": { + "type": "Transitive", + "resolved": "2.70.0", + "contentHash": "xNv0FFCVJa5S1beUtye82WFCxKThuE1jbN8DO1x1Rj8VSIWXLBUmfSID5a1fGzsU2R/EMfwPoWclJ2RMfQuGXw==", + "dependencies": { + "Grpc.Net.Common": "2.70.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0" + } + }, + "Grpc.Net.ClientFactory": { + "type": "Transitive", + "resolved": "2.70.0", + "contentHash": "Qg+93oj/8RdEw3PnLZNNYWnWCWyJYC/ZYZcjeln/pLaxLaPvdXES1peiqSJUI4wLFZ1JwGlbWt8+nM1i2E7ihg==", + "dependencies": { + "Grpc.Net.Client": "2.70.0", + "Microsoft.Extensions.Http": "6.0.0" + } + }, + "Grpc.Net.Common": { + "type": "Transitive", + "resolved": "2.70.0", + "contentHash": "rBdEUMyCwa+iB8mqC6JKyPbj3SBHHkReJj/yy/XKJI63GcG6w9DJMMGTVcYHqq4Ci2W4m0HT4jt2pFfFscar8g==", + "dependencies": { + "Grpc.Core.Api": "2.70.0" + } + }, + "Grpc.Tools": { + "type": "Transitive", + "resolved": "2.71.0", + "contentHash": "r8zHZm7kHdMrtujnkcuQ0BNDH2969at/8Va1ZzQgVblaQzR7tm8JlA3G+5Z5IFbvvf9PcAr1/VcoSR+g7j4Nyw==" + }, + "Humanizer.Core": { + "type": "Transitive", + "resolved": "2.14.1", + "contentHash": "lQKvtaTDOXnoVJ20ibTuSIOf2i0uO0MPbDhd1jm238I+U/2ZnRENj0cktKZhtchBMtCUSRQ5v4xBCUbKNmyVMw==" + }, + "IdentityModel": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "to99aLL5Gev1GOb2gUao/UZXT/uXMyjEmHPNrf/vJI2HBD1LMCTeC4SBCe/cqMIB12V9v+eSieq7ff0lju9pOQ==" + }, + "IdentityModel.OidcClient": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "m2PZbjeG3nXIQ72NLZvFz3FLFk7GmqLnxO/ifUvaTEE3BDZXp7DXAdjDP6TQKaL20+wDnej2ffA1Yh3vVcJOkA==", + "dependencies": { + "IdentityModel": "7.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0" + } + }, + "Json.More.Net": { + "type": "Transitive", + "resolved": "2.1.0", + "contentHash": "qtwsyAsL55y2vB2/sK4Pjg3ZyVzD5KKSpV3lOAMHlnjFfsjQ/86eHJfQT9aV1YysVXzF4+xyHOZbh7Iu3YQ7Lg==" + }, + "JsonPatch.Net": { + "type": "Transitive", + "resolved": "3.3.0", + "contentHash": "GIcMMDtzfzVfIpQgey8w7dhzcw6jG5nD4DDAdQCTmHfblkCvN7mI8K03to8YyUhKMl4PTR6D6nLSvWmyOGFNTg==", + "dependencies": { + "JsonPointer.Net": "5.2.0" + } + }, + "JsonPointer.Net": { + "type": "Transitive", + "resolved": "5.2.0", + "contentHash": "qe1F7Tr/p4mgwLPU9P60MbYkp+xnL2uCPnWXGgzfR/AZCunAZIC0RZ32dLGJJEhSuLEfm0YF/1R3u5C7mEVq+w==", + "dependencies": { + "Humanizer.Core": "2.14.1", + "Json.More.Net": "2.1.0" + } + }, + "KubernetesClient": { + "type": "Transitive", + "resolved": "16.0.2", + "contentHash": "MTec7O7S23OtffS7lGnt75Q3h2/Jdl+y54uoJyP6MeGnvzeuAGq5n8QSaqUkLvDILvD92FS5kcEqpiCr79UnWQ==", + "dependencies": { + "Fractions": "7.3.0", + "IdentityModel.OidcClient": "6.0.0", + "System.IdentityModel.Tokens.Jwt": "8.3.0", + "YamlDotNet": "16.3.0" + } + }, + "MessagePack": { + "type": "Transitive", + "resolved": "2.5.192", + "contentHash": "Jtle5MaFeIFkdXtxQeL9Tu2Y3HsAQGoSntOzrn6Br/jrl6c8QmG22GEioT5HBtZJR0zw0s46OnKU8ei2M3QifA==", + "dependencies": { + "MessagePack.Annotations": "2.5.192", + "Microsoft.NET.StringTools": "17.6.3" + } + }, + "MessagePack.Annotations": { + "type": "Transitive", + "resolved": "2.5.192", + "contentHash": "jaJuwcgovWIZ8Zysdyf3b7b34/BrADw4v82GaEZymUhDd3ScMPrYd/cttekeDteJJPXseJxp04yTIcxiVUjTWg==" + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "3WA9q9yVqJp222P3x1wYIGDAkpjAku0TMUaaQV22g6L67AI0LdOIrVS7Ht2vJfLHGSPVuqN94vIr15qn+HEkHw==" + }, + "Microsoft.Extensions.Caching.Abstractions": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "imcZ5BGhBw5mNsWLepBbqqumWaFe0GtvyCvne2/2wsDIBRa2+Lhx4cU/pKt/4BwOizzUEOls2k1eOJQXHGMalg==", + "dependencies": { + "Microsoft.Extensions.Primitives": "9.0.4" + } + }, + "Microsoft.Extensions.Caching.Hybrid": { + "type": "Transitive", + "resolved": "9.4.0", + "contentHash": "GtHP+DRraRM6RLq7TzUV8Iiyqm+WemJRLDNqy7uvA+Dgf6fjvxpmHnzgPb+RAcRNjADz961DMHHZ4i5EQjpDPw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.Caching.Memory": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "G5rEq1Qez5VJDTEyRsRUnewAspKjaY57VGsdZ8g8Ja6sXXzoiI3PpTd1t43HjHqNWD5A06MQveb2lscn+2CU+w==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4", + "Microsoft.Extensions.Primitives": "9.0.4" + } + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "0J/9YNXTMWSZP2p2+nvl8p71zpSwokZXZuJW+VjdErkegAnFdO1XlqtA62SJtgVYHdKu3uPxJHcMR/r35HwFBA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "8.0.2", + "contentHash": "7IQhGK+wjyGrNsPBjJcZwWAr+Wf6D4+TwOptUt77bWtgNkiV8tDEbhFS+dDamtQFZ2X7kWG9m71iZQRj2x3zgQ==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.CommandLine": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "NZuZMz3Q8Z780nKX3ifV1fE7lS+6pynDHK71OfU4OZ1ItgvDOhyOC7E6z+JMZrAj63zRpwbdldYFk499t3+1dQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.EnvironmentVariables": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "plvZ0ZIpq+97gdPNNvhwvrEZ92kNml9hd1pe3idMA7svR0PztdzVLkoWLcRFgySYXUJc3kSM3Xw3mNFMo/bxRA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.FileExtensions": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "EJzSNO9oaAXnTdtdNO6npPRsIIeZCBSNmdQ091VDO7fBiOtJAAeEq6dtrVXIi3ZyjC5XRSAtVvF8SzcneRHqKQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Physical": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.Json": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "L89DLNuimOghjV3tLx0ArFDwVEJD6+uGB3BMCMX01kaLzXkaXHb2021xOMl2QOxUxbdePKUZsUY7n2UUkycjRg==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.FileExtensions": "8.0.1", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.UserSecrets": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "7tYqdPPpAK+3jO9d5LTuCK2VxrEdf85Ol4trUr6ds4jclBecadWZ/RyPCbNjfbN5iGTfUnD/h65TOQuqQv2c+A==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Json": "8.0.1", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Physical": "8.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "BmANAnR5Xd4Oqw7yQ75xOAYODybZQRzdeNucg7kS5wWKd2PNnMdYtJ2Vciy0QLylRmv42DGl5+AFL9izA6F1Rw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "UI0TQPVkS78bFdjkTodmkH0Fe8lXv9LnhGFKgKrsgUJ5a5FVdFRcgjIkBVLbGgdRhxWirxH/8IXUtEyYJx6GQg==" + }, + "Microsoft.Extensions.Diagnostics": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "doVPCUUCY7c6LhBsEfiy3W1bvS7Mi6LkfQMS8nlC22jZWNxBv8VO8bdfeyvpYFst6Kxqk7HBC6lytmEoBssvSQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.1", + "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0" + } + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "elH2vmwNmsXuKmUeMQ4YW9ldXiF+gSGDgg1vORksob5POnpaI6caj1Hu8zaYbEuibhqCoWg0YRWDazBY3zjBfg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.Extensions.Diagnostics.HealthChecks": { + "type": "Transitive", + "resolved": "8.0.15", + "contentHash": "+Z6pfO5PnDa9/QCAB8DhmLtmjh0Z4A3i/5X5k3TBqKjCD4o88oUoyI240ras/LDsrFcjYXVLDsBZbuoN9ihjuw==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "8.0.15", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.3", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { + "type": "Transitive", + "resolved": "8.0.15", + "contentHash": "FkN4TMmKdpvuwhBlt7rt7op1RyyHvS/obnHAIOes0+cYU5uBiz7ciYpGkLZmbKGvRm9tUEfB9HpEg27kIwvXEQ==" + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.FileProviders.Physical": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "UboiXxpPUpwulHvIAVE36Knq0VSHaAmfrFkegLyBZeaADuKezJ/AIXYAW8F5GBlGk/VaibN2k/Zn1ca8YAfVdA==", + "dependencies": { + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileSystemGlobbing": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.FileSystemGlobbing": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "OK+670i7esqlQrPjdIKRbsyMCe9g5kSLpRRQGSr4Q58AOYEe/hCnfLZprh7viNisSUUQZmMrbbuDaIrP+V1ebQ==" + }, + "Microsoft.Extensions.Hosting": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "bP9EEkHBEfjgYiG8nUaXqMk/ujwJrffOkNPP7onpRMO8R+OUSESSP4xHkCAXgYZ1COP2Q9lXlU5gkMFh20gRuw==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.2", + "Microsoft.Extensions.Configuration.CommandLine": "8.0.0", + "Microsoft.Extensions.Configuration.EnvironmentVariables": "8.0.0", + "Microsoft.Extensions.Configuration.FileExtensions": "8.0.1", + "Microsoft.Extensions.Configuration.Json": "8.0.1", + "Microsoft.Extensions.Configuration.UserSecrets": "8.0.1", + "Microsoft.Extensions.DependencyInjection": "8.0.1", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Diagnostics": "8.0.1", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Physical": "8.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.1", + "Microsoft.Extensions.Logging": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Logging.Configuration": "8.0.1", + "Microsoft.Extensions.Logging.Console": "8.0.1", + "Microsoft.Extensions.Logging.Debug": "8.0.1", + "Microsoft.Extensions.Logging.EventLog": "8.0.1", + "Microsoft.Extensions.Logging.EventSource": "8.0.1", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.Extensions.Hosting.Abstractions": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "nHwq9aPBdBPYXPti6wYEEfgXddfBrYC+CQLn+qISiwQq5tpfaqDZSKOJNxoe9rfQxGf1c+2wC/qWFe1QYJPYqw==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.1", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2" + } + }, + "Microsoft.Extensions.Http": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "kDYeKJUzh0qeg/AI+nSr3ffthmXYQTEb0nS9qRC7YhSbbuN4M4NPbaB77AJwtkTnCV9XZ7qYj3dkZaNcyl73EA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Diagnostics": "8.0.1", + "Microsoft.Extensions.Logging": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "4x+pzsQEbqxhNf1QYRr5TDkLP9UsLT3A6MdRKDDEgrW7h1ljiEPgTNhKYUhNCCAaVpQECVQ+onA91PTPnIp6Lw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "0MXlimU4Dud6t+iNi5NEz3dO2w1HXdhoOLaYFuLPCjAsvlPQGwOT6V2KZRMLEhCAm/stSZt1AUv0XmDdkjvtbw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", + "System.Diagnostics.DiagnosticSource": "9.0.4" + } + }, + "Microsoft.Extensions.Logging.Configuration": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "QWwTrsgOnJMmn+XUslm8D2H1n3PkP/u/v52FODtyBc/k4W9r3i2vcXXeeX/upnzllJYRRbrzVzT0OclfNJtBJA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.2", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Logging": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Options": "8.0.2", + "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0" + } + }, + "Microsoft.Extensions.Logging.Console": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "uzcg/5U2eLyn5LIKlERkdSxw6VPC1yydnOSQiRRWGBGN3kphq3iL4emORzrojScDmxRhv49gp5BI8U3Dz7y4iA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Logging": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Logging.Configuration": "8.0.1", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.Extensions.Logging.Debug": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "B8hqNuYudC2RB+L/DI33uO4rf5by41fZVdcVL2oZj0UyoAZqnwTwYHp1KafoH4nkl1/23piNeybFFASaV2HkFg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Logging": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2" + } + }, + "Microsoft.Extensions.Logging.EventLog": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "ZD1m4GXoxcZeDJIq8qePKj+QAWeQNO/OG8skvrOG8RQfxLp9MAKRoliTc27xanoNUzeqvX5HhS/I7c0BvwAYUg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Logging": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Options": "8.0.2", + "System.Diagnostics.EventLog": "8.0.1" + } + }, + "Microsoft.Extensions.Logging.EventSource": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "YMXMAla6B6sEf/SnfZYTty633Ool3AH7KOw2LOaaEqwSo2piK4f7HMtzyc3CNiipDnq1fsUSuG5Oc7ZzpVy8WQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Logging": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Options": "8.0.2", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "fiFI2+58kicqVZyt/6obqoFwHiab7LC4FkQ3mmiBJ28Yy4fAvy2+v9MRnSvvlOO8chTOjKsdafFl/K9veCPo5g==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", + "Microsoft.Extensions.Primitives": "9.0.4" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "0f4DMRqEd50zQh+UyJc+/HiBsZ3vhAQALgdkcQEalSH1L2isdC7Yj54M3cyo5e+BeO5fcBQ7Dxly8XiBBcvRgw==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "SPFyMjyku1nqTFFJ928JAMd0QnRe4xjE7KeKnZMWXf3xk+6e0WiOZAluYtLdbJUXtsl2cCRSi8cBquJ408k8RA==" + }, + "Microsoft.IdentityModel.Abstractions": { + "type": "Transitive", + "resolved": "8.3.0", + "contentHash": "jNin7yvWZu+K3U24q+6kD+LmGSRfbkHl9Px8hN1XrGwq6ZHgKGi/zuTm5m08G27fwqKfVXIWuIcUeq4Y1VQUOg==" + }, + "Microsoft.IdentityModel.JsonWebTokens": { + "type": "Transitive", + "resolved": "8.3.0", + "contentHash": "4SVXLT8sDG7CrHiszEBrsDYi+aDW0W9d+fuWUGdZPBdan56aM6fGXJDjbI0TVGEDjJhXbACQd8F/BnC7a+m2RQ==", + "dependencies": { + "Microsoft.IdentityModel.Tokens": "8.3.0" + } + }, + "Microsoft.IdentityModel.Logging": { + "type": "Transitive", + "resolved": "8.3.0", + "contentHash": "4w4pSIGHhCCLTHqtVNR2Cc/zbDIUWIBHTZCu/9ZHm2SVwrXY3RJMcZ7EFGiKqmKZMQZJzA0bpwCZ6R8Yb7i5VQ==", + "dependencies": { + "Microsoft.IdentityModel.Abstractions": "8.3.0" + } + }, + "Microsoft.IdentityModel.Tokens": { + "type": "Transitive", + "resolved": "8.3.0", + "contentHash": "yGzqmk+kInH50zeSEH/L1/J0G4/yqTQNq4YmdzOhpE7s/86tz37NS2YbbY2ievbyGjmeBI1mq26QH+yBR6AK3Q==", + "dependencies": { + "Microsoft.IdentityModel.Logging": "8.3.0" + } + }, + "Microsoft.NET.StringTools": { + "type": "Transitive", + "resolved": "17.6.3", + "contentHash": "N0ZIanl1QCgvUumEL1laasU0a7sOE5ZwLZVTn0pAePnfhq8P7SvTjF8Axq+CnavuQkmdQpGNXQ1efZtu5kDFbA==" + }, + "Microsoft.VisualStudio.Threading.Only": { + "type": "Transitive", + "resolved": "17.13.61", + "contentHash": "vl5a2URJYCO5m+aZZtNlAXAMz28e2pUotRuoHD7RnCWOCeoyd8hWp5ZBaLNYq4iEj2oeJx5ZxiSboAjVmB20Qg==", + "dependencies": { + "Microsoft.VisualStudio.Validation": "17.8.8" + } + }, + "Microsoft.VisualStudio.Validation": { + "type": "Transitive", + "resolved": "17.8.8", + "contentHash": "rWXThIpyQd4YIXghNkiv2+VLvzS+MCMKVRDR0GAMlflsdo+YcAN2g2r5U1Ah98OFjQMRexTFtXQQ2LkajxZi3g==" + }, + "NATS.Client.Core": { + "type": "Transitive", + "resolved": "2.6.0", + "contentHash": "6mh+fSB9Fx6QfbYRjvswbWDgD04ePBYzB2yIY5GqzyUiUboqxpuOUDO2QOTNkwIqi8IpTMKcySAY+V/DvmvtQA==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "6.0.1", + "Microsoft.Extensions.Primitives": "6.0.0", + "System.IO.Pipelines": "8.0.0", + "System.Text.Json": "8.0.5" + } + }, + "NATS.Client.JetStream": { + "type": "Transitive", + "resolved": "2.6.0", + "contentHash": "3t5UJyN6nnsrDxWBxklNK06rnNL9aEjnzcOHCXRcZpcfFGeWFm4dG5UXtt7WiW69uWY4MHUlOcbuBKh5/rAuSQ==", + "dependencies": { + "NATS.Client.Core": "2.6.0" + } + }, + "NATS.Client.KeyValueStore": { + "type": "Transitive", + "resolved": "2.6.0", + "contentHash": "/us915HAGYdGAdblH2857w3xapZupmU4vNDODMfysgcg/tLineOtQ2+FqcSrmCVJ6mILngeuHGTk5vghunTpog==", + "dependencies": { + "NATS.Client.JetStream": "2.6.0" + } + }, + "Nerdbank.Streams": { + "type": "Transitive", + "resolved": "2.11.90", + "contentHash": "7jrOfU6b/PVBccqzNLfw9u84WWzkSpvWLb2mZxvwdQkOx/V9FXWkmnp/rjOnBFDOhrO/ev4+gQ5QS13FkgNSBA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "8.0.0", + "Microsoft.VisualStudio.Threading.Only": "17.13.61", + "Microsoft.VisualStudio.Validation": "17.8.8", + "System.IO.Pipelines": "8.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.1.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.3", + "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" + }, + "Pipelines.Sockets.Unofficial": { + "type": "Transitive", + "resolved": "2.2.8", + "contentHash": "zG2FApP5zxSx6OcdJQLbZDk2AVlN2BNQD6MorwIfV6gVj0RRxWPEp2LXAxqDGZqeNV1Zp0BNPcNaey/GXmTdvQ==", + "dependencies": { + "System.IO.Pipelines": "5.0.1" + } + }, + "Polly.Core": { + "type": "Transitive", + "resolved": "8.5.2", + "contentHash": "1MJKdxv4zwDmiWvYvVN24DsrWUfgQ4F83voH8bhbtLMdPuGy8CfTUzsgQhvyrl1a7hrM6f/ydwLVdVUI0xooUw==" + }, + "StackExchange.Redis": { + "type": "Transitive", + "resolved": "2.8.31", + "contentHash": "RCHVQa9Zke8k0oBgJn1Yl6BuYy8i6kv+sdMObiH60nOwD6QvWAjxdDwOm+LO78E8WsGiPqgOuItkz98fPS6haQ==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Pipelines.Sockets.Unofficial": "2.2.8" + } + }, + "StreamJsonRpc": { + "type": "Transitive", + "resolved": "2.21.69", + "contentHash": "WbTpn/PIo+HpFYnsOCiOOe0kHUE2N1eiVRi7MO70DFBTMG3pAOfrgHtwUpOJ37dfDETq/9P9WNIbHom4ABZfrA==", + "dependencies": { + "MessagePack": "2.5.192", + "Microsoft.Bcl.AsyncInterfaces": "8.0.0", + "Microsoft.VisualStudio.Threading.Only": "17.13.61", + "Microsoft.VisualStudio.Validation": "17.8.8", + "Nerdbank.Streams": "2.11.90", + "Newtonsoft.Json": "13.0.3", + "System.IO.Pipelines": "8.0.0" + } + }, + "StyleCop.Analyzers.Unstable": { + "type": "Transitive", + "resolved": "1.2.0.556", + "contentHash": "zvn9Mqs/ox/83cpYPignI8hJEM2A93s2HkHs8HYMOAQW0PkampyoErAiIyKxgTLqbbad29HX/shv/6LGSjPJNQ==" + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "Be0emq8bRmcK4eeJIFUt9+vYPf7kzuQrFs8Ef1CdGvXpq/uSve22PTSkRF09bF/J7wmYJ2DHf2v7GaT3vMXnwQ==" + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "n1ZP7NM2Gkn/MgD8+eOT5MulMj6wfeQMNS2Pizvq5GHCZfjlFMXV2irQlQmJhwA2VABC57M0auudO89Iu2uRLg==" + }, + "System.IdentityModel.Tokens.Jwt": { + "type": "Transitive", + "resolved": "8.3.0", + "contentHash": "9GESpDG0Zb17HD5mBW/uEWi2yz/uKPmCthX2UhyLnk42moGH2FpMgXA2Y4l2Qc7P75eXSUTA6wb/c9D9GSVkzw==", + "dependencies": { + "Microsoft.IdentityModel.JsonWebTokens": "8.3.0", + "Microsoft.IdentityModel.Tokens": "8.3.0" + } + }, + "System.IO.Hashing": { + "type": "Transitive", + "resolved": "9.0.3", + "contentHash": "BrMGzDRLz410PE4qC8UeKeAc0hFRjBkiCUOLTwuod65NAjqg5tDNqYU7gP0A09taEXtecB+HJc1NNnnTjsKFAQ==" + }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.1.0", + "contentHash": "5o/HZxx6RVqYlhKSq8/zronDkALJZUT2Vz0hx43f0gwe8mwlM0y2nYlqdBwLMzr262Bwvpikeb/yEwkAa5PADg==" + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "8.0.5", + "contentHash": "0f1B50Ss7rqxXiaBJyzUu9bWFOO2/zSlifZ/UNMdiIpDYe4cY4LQQicP4nirK1OS31I43rn062UIJ1Q9bpmHpg==" + }, + "YamlDotNet": { + "type": "Transitive", + "resolved": "16.3.0", + "contentHash": "SgMOdxbz8X65z8hraIs6hOEdnkH6hESTAIUa7viEngHOYaH+6q5XJmwr1+yb9vJpNQ19hCQY69xbFsLtXpobQA==" + }, + "CodeCargo.Nats.DistributedCache": { + "type": "Project", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "[9.0.4, )", + "Microsoft.Extensions.Logging.Abstractions": "[9.0.4, )", + "Microsoft.Extensions.Options": "[9.0.4, )", + "NATS.Client.KeyValueStore": "[2.6.0, )" + } + }, + "CodeCargo.Nats.HybridCacheExtensions": { + "type": "Project", + "dependencies": { + "CodeCargo.Nats.DistributedCache": "[1.0.0, )", + "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )" + } + } + } + } +} \ No newline at end of file diff --git a/util/RedisAppHost/packages.osx-arm64.lock.json b/util/RedisAppHost/packages.osx-arm64.lock.json new file mode 100644 index 0000000..2623c00 --- /dev/null +++ b/util/RedisAppHost/packages.osx-arm64.lock.json @@ -0,0 +1,814 @@ +{ + "version": 1, + "dependencies": { + "net8.0": { + "Aspire.Dashboard.Sdk.osx-arm64": { + "type": "Direct", + "requested": "[9.2.1, )", + "resolved": "9.2.1", + "contentHash": "xyQZs/k7ClzXeftqJ8438uV4SWhfGQV1ePJgO52oeuhiI1Wjg1xhDZ4wy7fXiU8vMMCW6+5QxJbQxlQLGRPozA==" + }, + "Aspire.Hosting.AppHost": { + "type": "Direct", + "requested": "[9.2.1, )", + "resolved": "9.2.1", + "contentHash": "fnJKXvMD82ma7nEug+b9BZq0zUcyD+TJZei+f7BWkfRrTKznch56P2hNWmQHCRG0ZicTB6SbKuRtVa3i7uFf1Q==", + "dependencies": { + "AspNetCore.HealthChecks.Uris": "9.0.0", + "Aspire.Hosting": "9.2.1", + "Google.Protobuf": "3.30.1", + "Grpc.AspNetCore": "2.70.0", + "Grpc.Net.ClientFactory": "2.70.0", + "Grpc.Tools": "2.71.0", + "Humanizer.Core": "2.14.1", + "JsonPatch.Net": "3.3.0", + "KubernetesClient": "16.0.2", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.2", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.15", + "Microsoft.Extensions.Hosting": "8.0.1", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.1", + "Microsoft.Extensions.Http": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.3", + "Microsoft.Extensions.Options": "8.0.2", + "Microsoft.Extensions.Primitives": "8.0.0", + "Newtonsoft.Json": "13.0.3", + "Polly.Core": "8.5.2", + "StreamJsonRpc": "2.21.69", + "System.IO.Hashing": "9.0.3" + } + }, + "Aspire.Hosting.Orchestration.osx-arm64": { + "type": "Direct", + "requested": "[9.2.1, )", + "resolved": "9.2.1", + "contentHash": "A6gbrMq04234e4kbaEQzvRblaA+vmzddYlQu97B8jVnPzldTboFS68Fc4TCgpiRnBThAsReeJvgTqhtZgwlYZQ==" + }, + "Aspire.Hosting.Redis": { + "type": "Direct", + "requested": "[9.2.1, )", + "resolved": "9.2.1", + "contentHash": "t/hsyOcxp2C03eWke7it9psgSajaUBDILjW3dWzw+S7OCd7lGrLzhbXEtq0wEcQXB3vnqKqRMnMZCTmRtnZswA==", + "dependencies": { + "AspNetCore.HealthChecks.Redis": "9.0.0", + "AspNetCore.HealthChecks.Uris": "9.0.0", + "Aspire.Hosting": "9.2.1", + "Google.Protobuf": "3.30.1", + "Grpc.AspNetCore": "2.70.0", + "Grpc.Net.ClientFactory": "2.70.0", + "Grpc.Tools": "2.71.0", + "Humanizer.Core": "2.14.1", + "JsonPatch.Net": "3.3.0", + "KubernetesClient": "16.0.2", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.2", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.15", + "Microsoft.Extensions.Hosting": "8.0.1", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.1", + "Microsoft.Extensions.Http": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.3", + "Microsoft.Extensions.Options": "8.0.2", + "Microsoft.Extensions.Primitives": "8.0.0", + "Newtonsoft.Json": "13.0.3", + "Polly.Core": "8.5.2", + "StackExchange.Redis": "2.8.31", + "StreamJsonRpc": "2.21.69", + "System.IO.Hashing": "9.0.3" + } + }, + "StyleCop.Analyzers": { + "type": "Direct", + "requested": "[1.2.0-beta.556, )", + "resolved": "1.2.0-beta.556", + "contentHash": "llRPgmA1fhC0I0QyFLEcjvtM2239QzKr/tcnbsjArLMJxJlu0AA5G7Fft0OI30pHF3MW63Gf4aSSsjc5m82J1Q==", + "dependencies": { + "StyleCop.Analyzers.Unstable": "1.2.0.556" + } + }, + "Aspire.Hosting": { + "type": "Transitive", + "resolved": "9.2.1", + "contentHash": "Awidk6C7nris+LT3Yq48oihv5uVbGmP/4rpO1sLxvxwuxSXEnPkrB2MTGCCqr3Z/e68u9J54s6p8RBdIYwTe0w==", + "dependencies": { + "AspNetCore.HealthChecks.Uris": "9.0.0", + "Google.Protobuf": "3.30.1", + "Grpc.AspNetCore": "2.70.0", + "Grpc.Net.ClientFactory": "2.70.0", + "Grpc.Tools": "2.71.0", + "Humanizer.Core": "2.14.1", + "JsonPatch.Net": "3.3.0", + "KubernetesClient": "16.0.2", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.2", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.15", + "Microsoft.Extensions.Hosting": "8.0.1", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.1", + "Microsoft.Extensions.Http": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.3", + "Microsoft.Extensions.Options": "8.0.2", + "Microsoft.Extensions.Primitives": "8.0.0", + "Newtonsoft.Json": "13.0.3", + "Polly.Core": "8.5.2", + "StreamJsonRpc": "2.21.69", + "System.IO.Hashing": "9.0.3" + } + }, + "AspNetCore.HealthChecks.Redis": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "yNH0h8GLRbAf+PU5HNVLZ5hNeyq9mDVmRKO9xuZsme/znUYoBJlQvI0gq45gaZNlLncCHkMhR4o90MuT+gxxPw==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.11", + "StackExchange.Redis": "2.7.4" + } + }, + "AspNetCore.HealthChecks.Uris": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "XYdNlA437KeF8p9qOpZFyNqAN+c0FXt/JjTvzH/Qans0q0O3pPE8KPnn39ucQQjR/Roum1vLTP3kXiUs8VHyuA==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.11", + "Microsoft.Extensions.Http": "8.0.0" + } + }, + "Fractions": { + "type": "Transitive", + "resolved": "7.3.0", + "contentHash": "2bETFWLBc8b7Ut2SVi+bxhGVwiSpknHYGBh2PADyGWONLkTxT7bKyDRhF8ao+XUv90tq8Fl7GTPxSI5bacIRJw==" + }, + "Google.Protobuf": { + "type": "Transitive", + "resolved": "3.30.1", + "contentHash": "HeWXDQBabQn/sCGicbeLJ0HMunknfC4FdLrOQOsaMJHcpqx3HVIpyyJqTrqJlWnza870twhOb+rBcaTiC/TlNA==" + }, + "Grpc.AspNetCore": { + "type": "Transitive", + "resolved": "2.70.0", + "contentHash": "s29ST5F2/PZLzOnfqfeDn0emAZajBtYnV9G7hkbK8Eu9+XphoL3KfiEsg2eBsx7P9YYQXcksDbE+CbHApMZeJA==", + "dependencies": { + "Google.Protobuf": "3.27.0", + "Grpc.AspNetCore.Server.ClientFactory": "2.70.0", + "Grpc.Tools": "2.70.0" + } + }, + "Grpc.AspNetCore.Server": { + "type": "Transitive", + "resolved": "2.70.0", + "contentHash": "9d6JuMLSxwOX4zERV7HBwq1XL8DD48a6FSoxD5dDXrCz/o0HqMXE2+lRcXHckOlz1JCesznW8XMMJdsU1FfY7w==", + "dependencies": { + "Grpc.Net.Common": "2.70.0" + } + }, + "Grpc.AspNetCore.Server.ClientFactory": { + "type": "Transitive", + "resolved": "2.70.0", + "contentHash": "k4GrvUAgVWm7DyhnV55MHdX4bQSpZVEQmlZO3bdSmGZ+z6Hx+CwDlhqiReczCm6qbzSUbS1YW0t7z7UEObTwKA==", + "dependencies": { + "Grpc.AspNetCore.Server": "2.70.0", + "Grpc.Net.ClientFactory": "2.70.0" + } + }, + "Grpc.Core.Api": { + "type": "Transitive", + "resolved": "2.70.0", + "contentHash": "66UotvWcSIq41oiQhLWcQACyKPM4umxXNiht5DQTLZJfNwEswWOcS7Z0xIEHyNIBE7ZpjotH22bEjTkvhPxmVw==" + }, + "Grpc.Net.Client": { + "type": "Transitive", + "resolved": "2.70.0", + "contentHash": "xNv0FFCVJa5S1beUtye82WFCxKThuE1jbN8DO1x1Rj8VSIWXLBUmfSID5a1fGzsU2R/EMfwPoWclJ2RMfQuGXw==", + "dependencies": { + "Grpc.Net.Common": "2.70.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0" + } + }, + "Grpc.Net.ClientFactory": { + "type": "Transitive", + "resolved": "2.70.0", + "contentHash": "Qg+93oj/8RdEw3PnLZNNYWnWCWyJYC/ZYZcjeln/pLaxLaPvdXES1peiqSJUI4wLFZ1JwGlbWt8+nM1i2E7ihg==", + "dependencies": { + "Grpc.Net.Client": "2.70.0", + "Microsoft.Extensions.Http": "6.0.0" + } + }, + "Grpc.Net.Common": { + "type": "Transitive", + "resolved": "2.70.0", + "contentHash": "rBdEUMyCwa+iB8mqC6JKyPbj3SBHHkReJj/yy/XKJI63GcG6w9DJMMGTVcYHqq4Ci2W4m0HT4jt2pFfFscar8g==", + "dependencies": { + "Grpc.Core.Api": "2.70.0" + } + }, + "Grpc.Tools": { + "type": "Transitive", + "resolved": "2.71.0", + "contentHash": "r8zHZm7kHdMrtujnkcuQ0BNDH2969at/8Va1ZzQgVblaQzR7tm8JlA3G+5Z5IFbvvf9PcAr1/VcoSR+g7j4Nyw==" + }, + "Humanizer.Core": { + "type": "Transitive", + "resolved": "2.14.1", + "contentHash": "lQKvtaTDOXnoVJ20ibTuSIOf2i0uO0MPbDhd1jm238I+U/2ZnRENj0cktKZhtchBMtCUSRQ5v4xBCUbKNmyVMw==" + }, + "IdentityModel": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "to99aLL5Gev1GOb2gUao/UZXT/uXMyjEmHPNrf/vJI2HBD1LMCTeC4SBCe/cqMIB12V9v+eSieq7ff0lju9pOQ==" + }, + "IdentityModel.OidcClient": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "m2PZbjeG3nXIQ72NLZvFz3FLFk7GmqLnxO/ifUvaTEE3BDZXp7DXAdjDP6TQKaL20+wDnej2ffA1Yh3vVcJOkA==", + "dependencies": { + "IdentityModel": "7.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0" + } + }, + "Json.More.Net": { + "type": "Transitive", + "resolved": "2.1.0", + "contentHash": "qtwsyAsL55y2vB2/sK4Pjg3ZyVzD5KKSpV3lOAMHlnjFfsjQ/86eHJfQT9aV1YysVXzF4+xyHOZbh7Iu3YQ7Lg==" + }, + "JsonPatch.Net": { + "type": "Transitive", + "resolved": "3.3.0", + "contentHash": "GIcMMDtzfzVfIpQgey8w7dhzcw6jG5nD4DDAdQCTmHfblkCvN7mI8K03to8YyUhKMl4PTR6D6nLSvWmyOGFNTg==", + "dependencies": { + "JsonPointer.Net": "5.2.0" + } + }, + "JsonPointer.Net": { + "type": "Transitive", + "resolved": "5.2.0", + "contentHash": "qe1F7Tr/p4mgwLPU9P60MbYkp+xnL2uCPnWXGgzfR/AZCunAZIC0RZ32dLGJJEhSuLEfm0YF/1R3u5C7mEVq+w==", + "dependencies": { + "Humanizer.Core": "2.14.1", + "Json.More.Net": "2.1.0" + } + }, + "KubernetesClient": { + "type": "Transitive", + "resolved": "16.0.2", + "contentHash": "MTec7O7S23OtffS7lGnt75Q3h2/Jdl+y54uoJyP6MeGnvzeuAGq5n8QSaqUkLvDILvD92FS5kcEqpiCr79UnWQ==", + "dependencies": { + "Fractions": "7.3.0", + "IdentityModel.OidcClient": "6.0.0", + "System.IdentityModel.Tokens.Jwt": "8.3.0", + "YamlDotNet": "16.3.0" + } + }, + "MessagePack": { + "type": "Transitive", + "resolved": "2.5.192", + "contentHash": "Jtle5MaFeIFkdXtxQeL9Tu2Y3HsAQGoSntOzrn6Br/jrl6c8QmG22GEioT5HBtZJR0zw0s46OnKU8ei2M3QifA==", + "dependencies": { + "MessagePack.Annotations": "2.5.192", + "Microsoft.NET.StringTools": "17.6.3" + } + }, + "MessagePack.Annotations": { + "type": "Transitive", + "resolved": "2.5.192", + "contentHash": "jaJuwcgovWIZ8Zysdyf3b7b34/BrADw4v82GaEZymUhDd3ScMPrYd/cttekeDteJJPXseJxp04yTIcxiVUjTWg==" + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "3WA9q9yVqJp222P3x1wYIGDAkpjAku0TMUaaQV22g6L67AI0LdOIrVS7Ht2vJfLHGSPVuqN94vIr15qn+HEkHw==" + }, + "Microsoft.Extensions.Caching.Abstractions": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "imcZ5BGhBw5mNsWLepBbqqumWaFe0GtvyCvne2/2wsDIBRa2+Lhx4cU/pKt/4BwOizzUEOls2k1eOJQXHGMalg==", + "dependencies": { + "Microsoft.Extensions.Primitives": "9.0.4" + } + }, + "Microsoft.Extensions.Caching.Hybrid": { + "type": "Transitive", + "resolved": "9.4.0", + "contentHash": "GtHP+DRraRM6RLq7TzUV8Iiyqm+WemJRLDNqy7uvA+Dgf6fjvxpmHnzgPb+RAcRNjADz961DMHHZ4i5EQjpDPw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.Caching.Memory": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "G5rEq1Qez5VJDTEyRsRUnewAspKjaY57VGsdZ8g8Ja6sXXzoiI3PpTd1t43HjHqNWD5A06MQveb2lscn+2CU+w==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4", + "Microsoft.Extensions.Primitives": "9.0.4" + } + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "0J/9YNXTMWSZP2p2+nvl8p71zpSwokZXZuJW+VjdErkegAnFdO1XlqtA62SJtgVYHdKu3uPxJHcMR/r35HwFBA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "8.0.2", + "contentHash": "7IQhGK+wjyGrNsPBjJcZwWAr+Wf6D4+TwOptUt77bWtgNkiV8tDEbhFS+dDamtQFZ2X7kWG9m71iZQRj2x3zgQ==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.CommandLine": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "NZuZMz3Q8Z780nKX3ifV1fE7lS+6pynDHK71OfU4OZ1ItgvDOhyOC7E6z+JMZrAj63zRpwbdldYFk499t3+1dQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.EnvironmentVariables": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "plvZ0ZIpq+97gdPNNvhwvrEZ92kNml9hd1pe3idMA7svR0PztdzVLkoWLcRFgySYXUJc3kSM3Xw3mNFMo/bxRA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.FileExtensions": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "EJzSNO9oaAXnTdtdNO6npPRsIIeZCBSNmdQ091VDO7fBiOtJAAeEq6dtrVXIi3ZyjC5XRSAtVvF8SzcneRHqKQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Physical": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.Json": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "L89DLNuimOghjV3tLx0ArFDwVEJD6+uGB3BMCMX01kaLzXkaXHb2021xOMl2QOxUxbdePKUZsUY7n2UUkycjRg==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.FileExtensions": "8.0.1", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.UserSecrets": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "7tYqdPPpAK+3jO9d5LTuCK2VxrEdf85Ol4trUr6ds4jclBecadWZ/RyPCbNjfbN5iGTfUnD/h65TOQuqQv2c+A==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Json": "8.0.1", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Physical": "8.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "BmANAnR5Xd4Oqw7yQ75xOAYODybZQRzdeNucg7kS5wWKd2PNnMdYtJ2Vciy0QLylRmv42DGl5+AFL9izA6F1Rw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "UI0TQPVkS78bFdjkTodmkH0Fe8lXv9LnhGFKgKrsgUJ5a5FVdFRcgjIkBVLbGgdRhxWirxH/8IXUtEyYJx6GQg==" + }, + "Microsoft.Extensions.Diagnostics": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "doVPCUUCY7c6LhBsEfiy3W1bvS7Mi6LkfQMS8nlC22jZWNxBv8VO8bdfeyvpYFst6Kxqk7HBC6lytmEoBssvSQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.1", + "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0" + } + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "elH2vmwNmsXuKmUeMQ4YW9ldXiF+gSGDgg1vORksob5POnpaI6caj1Hu8zaYbEuibhqCoWg0YRWDazBY3zjBfg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.Extensions.Diagnostics.HealthChecks": { + "type": "Transitive", + "resolved": "8.0.15", + "contentHash": "+Z6pfO5PnDa9/QCAB8DhmLtmjh0Z4A3i/5X5k3TBqKjCD4o88oUoyI240ras/LDsrFcjYXVLDsBZbuoN9ihjuw==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "8.0.15", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.3", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { + "type": "Transitive", + "resolved": "8.0.15", + "contentHash": "FkN4TMmKdpvuwhBlt7rt7op1RyyHvS/obnHAIOes0+cYU5uBiz7ciYpGkLZmbKGvRm9tUEfB9HpEg27kIwvXEQ==" + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.FileProviders.Physical": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "UboiXxpPUpwulHvIAVE36Knq0VSHaAmfrFkegLyBZeaADuKezJ/AIXYAW8F5GBlGk/VaibN2k/Zn1ca8YAfVdA==", + "dependencies": { + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileSystemGlobbing": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.FileSystemGlobbing": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "OK+670i7esqlQrPjdIKRbsyMCe9g5kSLpRRQGSr4Q58AOYEe/hCnfLZprh7viNisSUUQZmMrbbuDaIrP+V1ebQ==" + }, + "Microsoft.Extensions.Hosting": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "bP9EEkHBEfjgYiG8nUaXqMk/ujwJrffOkNPP7onpRMO8R+OUSESSP4xHkCAXgYZ1COP2Q9lXlU5gkMFh20gRuw==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.2", + "Microsoft.Extensions.Configuration.CommandLine": "8.0.0", + "Microsoft.Extensions.Configuration.EnvironmentVariables": "8.0.0", + "Microsoft.Extensions.Configuration.FileExtensions": "8.0.1", + "Microsoft.Extensions.Configuration.Json": "8.0.1", + "Microsoft.Extensions.Configuration.UserSecrets": "8.0.1", + "Microsoft.Extensions.DependencyInjection": "8.0.1", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Diagnostics": "8.0.1", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Physical": "8.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.1", + "Microsoft.Extensions.Logging": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Logging.Configuration": "8.0.1", + "Microsoft.Extensions.Logging.Console": "8.0.1", + "Microsoft.Extensions.Logging.Debug": "8.0.1", + "Microsoft.Extensions.Logging.EventLog": "8.0.1", + "Microsoft.Extensions.Logging.EventSource": "8.0.1", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.Extensions.Hosting.Abstractions": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "nHwq9aPBdBPYXPti6wYEEfgXddfBrYC+CQLn+qISiwQq5tpfaqDZSKOJNxoe9rfQxGf1c+2wC/qWFe1QYJPYqw==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.1", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2" + } + }, + "Microsoft.Extensions.Http": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "kDYeKJUzh0qeg/AI+nSr3ffthmXYQTEb0nS9qRC7YhSbbuN4M4NPbaB77AJwtkTnCV9XZ7qYj3dkZaNcyl73EA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Diagnostics": "8.0.1", + "Microsoft.Extensions.Logging": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "4x+pzsQEbqxhNf1QYRr5TDkLP9UsLT3A6MdRKDDEgrW7h1ljiEPgTNhKYUhNCCAaVpQECVQ+onA91PTPnIp6Lw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "0MXlimU4Dud6t+iNi5NEz3dO2w1HXdhoOLaYFuLPCjAsvlPQGwOT6V2KZRMLEhCAm/stSZt1AUv0XmDdkjvtbw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", + "System.Diagnostics.DiagnosticSource": "9.0.4" + } + }, + "Microsoft.Extensions.Logging.Configuration": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "QWwTrsgOnJMmn+XUslm8D2H1n3PkP/u/v52FODtyBc/k4W9r3i2vcXXeeX/upnzllJYRRbrzVzT0OclfNJtBJA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.2", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Logging": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Options": "8.0.2", + "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0" + } + }, + "Microsoft.Extensions.Logging.Console": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "uzcg/5U2eLyn5LIKlERkdSxw6VPC1yydnOSQiRRWGBGN3kphq3iL4emORzrojScDmxRhv49gp5BI8U3Dz7y4iA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Logging": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Logging.Configuration": "8.0.1", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.Extensions.Logging.Debug": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "B8hqNuYudC2RB+L/DI33uO4rf5by41fZVdcVL2oZj0UyoAZqnwTwYHp1KafoH4nkl1/23piNeybFFASaV2HkFg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Logging": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2" + } + }, + "Microsoft.Extensions.Logging.EventLog": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "ZD1m4GXoxcZeDJIq8qePKj+QAWeQNO/OG8skvrOG8RQfxLp9MAKRoliTc27xanoNUzeqvX5HhS/I7c0BvwAYUg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Logging": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Options": "8.0.2", + "System.Diagnostics.EventLog": "8.0.1" + } + }, + "Microsoft.Extensions.Logging.EventSource": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "YMXMAla6B6sEf/SnfZYTty633Ool3AH7KOw2LOaaEqwSo2piK4f7HMtzyc3CNiipDnq1fsUSuG5Oc7ZzpVy8WQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Logging": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Options": "8.0.2", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "fiFI2+58kicqVZyt/6obqoFwHiab7LC4FkQ3mmiBJ28Yy4fAvy2+v9MRnSvvlOO8chTOjKsdafFl/K9veCPo5g==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", + "Microsoft.Extensions.Primitives": "9.0.4" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "0f4DMRqEd50zQh+UyJc+/HiBsZ3vhAQALgdkcQEalSH1L2isdC7Yj54M3cyo5e+BeO5fcBQ7Dxly8XiBBcvRgw==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "SPFyMjyku1nqTFFJ928JAMd0QnRe4xjE7KeKnZMWXf3xk+6e0WiOZAluYtLdbJUXtsl2cCRSi8cBquJ408k8RA==" + }, + "Microsoft.IdentityModel.Abstractions": { + "type": "Transitive", + "resolved": "8.3.0", + "contentHash": "jNin7yvWZu+K3U24q+6kD+LmGSRfbkHl9Px8hN1XrGwq6ZHgKGi/zuTm5m08G27fwqKfVXIWuIcUeq4Y1VQUOg==" + }, + "Microsoft.IdentityModel.JsonWebTokens": { + "type": "Transitive", + "resolved": "8.3.0", + "contentHash": "4SVXLT8sDG7CrHiszEBrsDYi+aDW0W9d+fuWUGdZPBdan56aM6fGXJDjbI0TVGEDjJhXbACQd8F/BnC7a+m2RQ==", + "dependencies": { + "Microsoft.IdentityModel.Tokens": "8.3.0" + } + }, + "Microsoft.IdentityModel.Logging": { + "type": "Transitive", + "resolved": "8.3.0", + "contentHash": "4w4pSIGHhCCLTHqtVNR2Cc/zbDIUWIBHTZCu/9ZHm2SVwrXY3RJMcZ7EFGiKqmKZMQZJzA0bpwCZ6R8Yb7i5VQ==", + "dependencies": { + "Microsoft.IdentityModel.Abstractions": "8.3.0" + } + }, + "Microsoft.IdentityModel.Tokens": { + "type": "Transitive", + "resolved": "8.3.0", + "contentHash": "yGzqmk+kInH50zeSEH/L1/J0G4/yqTQNq4YmdzOhpE7s/86tz37NS2YbbY2ievbyGjmeBI1mq26QH+yBR6AK3Q==", + "dependencies": { + "Microsoft.IdentityModel.Logging": "8.3.0" + } + }, + "Microsoft.NET.StringTools": { + "type": "Transitive", + "resolved": "17.6.3", + "contentHash": "N0ZIanl1QCgvUumEL1laasU0a7sOE5ZwLZVTn0pAePnfhq8P7SvTjF8Axq+CnavuQkmdQpGNXQ1efZtu5kDFbA==" + }, + "Microsoft.VisualStudio.Threading.Only": { + "type": "Transitive", + "resolved": "17.13.61", + "contentHash": "vl5a2URJYCO5m+aZZtNlAXAMz28e2pUotRuoHD7RnCWOCeoyd8hWp5ZBaLNYq4iEj2oeJx5ZxiSboAjVmB20Qg==", + "dependencies": { + "Microsoft.VisualStudio.Validation": "17.8.8" + } + }, + "Microsoft.VisualStudio.Validation": { + "type": "Transitive", + "resolved": "17.8.8", + "contentHash": "rWXThIpyQd4YIXghNkiv2+VLvzS+MCMKVRDR0GAMlflsdo+YcAN2g2r5U1Ah98OFjQMRexTFtXQQ2LkajxZi3g==" + }, + "NATS.Client.Core": { + "type": "Transitive", + "resolved": "2.6.0", + "contentHash": "6mh+fSB9Fx6QfbYRjvswbWDgD04ePBYzB2yIY5GqzyUiUboqxpuOUDO2QOTNkwIqi8IpTMKcySAY+V/DvmvtQA==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "6.0.1", + "Microsoft.Extensions.Primitives": "6.0.0", + "System.IO.Pipelines": "8.0.0", + "System.Text.Json": "8.0.5" + } + }, + "NATS.Client.JetStream": { + "type": "Transitive", + "resolved": "2.6.0", + "contentHash": "3t5UJyN6nnsrDxWBxklNK06rnNL9aEjnzcOHCXRcZpcfFGeWFm4dG5UXtt7WiW69uWY4MHUlOcbuBKh5/rAuSQ==", + "dependencies": { + "NATS.Client.Core": "2.6.0" + } + }, + "NATS.Client.KeyValueStore": { + "type": "Transitive", + "resolved": "2.6.0", + "contentHash": "/us915HAGYdGAdblH2857w3xapZupmU4vNDODMfysgcg/tLineOtQ2+FqcSrmCVJ6mILngeuHGTk5vghunTpog==", + "dependencies": { + "NATS.Client.JetStream": "2.6.0" + } + }, + "Nerdbank.Streams": { + "type": "Transitive", + "resolved": "2.11.90", + "contentHash": "7jrOfU6b/PVBccqzNLfw9u84WWzkSpvWLb2mZxvwdQkOx/V9FXWkmnp/rjOnBFDOhrO/ev4+gQ5QS13FkgNSBA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "8.0.0", + "Microsoft.VisualStudio.Threading.Only": "17.13.61", + "Microsoft.VisualStudio.Validation": "17.8.8", + "System.IO.Pipelines": "8.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.1.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.3", + "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" + }, + "Pipelines.Sockets.Unofficial": { + "type": "Transitive", + "resolved": "2.2.8", + "contentHash": "zG2FApP5zxSx6OcdJQLbZDk2AVlN2BNQD6MorwIfV6gVj0RRxWPEp2LXAxqDGZqeNV1Zp0BNPcNaey/GXmTdvQ==", + "dependencies": { + "System.IO.Pipelines": "5.0.1" + } + }, + "Polly.Core": { + "type": "Transitive", + "resolved": "8.5.2", + "contentHash": "1MJKdxv4zwDmiWvYvVN24DsrWUfgQ4F83voH8bhbtLMdPuGy8CfTUzsgQhvyrl1a7hrM6f/ydwLVdVUI0xooUw==" + }, + "StackExchange.Redis": { + "type": "Transitive", + "resolved": "2.8.31", + "contentHash": "RCHVQa9Zke8k0oBgJn1Yl6BuYy8i6kv+sdMObiH60nOwD6QvWAjxdDwOm+LO78E8WsGiPqgOuItkz98fPS6haQ==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Pipelines.Sockets.Unofficial": "2.2.8" + } + }, + "StreamJsonRpc": { + "type": "Transitive", + "resolved": "2.21.69", + "contentHash": "WbTpn/PIo+HpFYnsOCiOOe0kHUE2N1eiVRi7MO70DFBTMG3pAOfrgHtwUpOJ37dfDETq/9P9WNIbHom4ABZfrA==", + "dependencies": { + "MessagePack": "2.5.192", + "Microsoft.Bcl.AsyncInterfaces": "8.0.0", + "Microsoft.VisualStudio.Threading.Only": "17.13.61", + "Microsoft.VisualStudio.Validation": "17.8.8", + "Nerdbank.Streams": "2.11.90", + "Newtonsoft.Json": "13.0.3", + "System.IO.Pipelines": "8.0.0" + } + }, + "StyleCop.Analyzers.Unstable": { + "type": "Transitive", + "resolved": "1.2.0.556", + "contentHash": "zvn9Mqs/ox/83cpYPignI8hJEM2A93s2HkHs8HYMOAQW0PkampyoErAiIyKxgTLqbbad29HX/shv/6LGSjPJNQ==" + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "Be0emq8bRmcK4eeJIFUt9+vYPf7kzuQrFs8Ef1CdGvXpq/uSve22PTSkRF09bF/J7wmYJ2DHf2v7GaT3vMXnwQ==" + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "n1ZP7NM2Gkn/MgD8+eOT5MulMj6wfeQMNS2Pizvq5GHCZfjlFMXV2irQlQmJhwA2VABC57M0auudO89Iu2uRLg==" + }, + "System.IdentityModel.Tokens.Jwt": { + "type": "Transitive", + "resolved": "8.3.0", + "contentHash": "9GESpDG0Zb17HD5mBW/uEWi2yz/uKPmCthX2UhyLnk42moGH2FpMgXA2Y4l2Qc7P75eXSUTA6wb/c9D9GSVkzw==", + "dependencies": { + "Microsoft.IdentityModel.JsonWebTokens": "8.3.0", + "Microsoft.IdentityModel.Tokens": "8.3.0" + } + }, + "System.IO.Hashing": { + "type": "Transitive", + "resolved": "9.0.3", + "contentHash": "BrMGzDRLz410PE4qC8UeKeAc0hFRjBkiCUOLTwuod65NAjqg5tDNqYU7gP0A09taEXtecB+HJc1NNnnTjsKFAQ==" + }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.1.0", + "contentHash": "5o/HZxx6RVqYlhKSq8/zronDkALJZUT2Vz0hx43f0gwe8mwlM0y2nYlqdBwLMzr262Bwvpikeb/yEwkAa5PADg==" + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "8.0.5", + "contentHash": "0f1B50Ss7rqxXiaBJyzUu9bWFOO2/zSlifZ/UNMdiIpDYe4cY4LQQicP4nirK1OS31I43rn062UIJ1Q9bpmHpg==" + }, + "YamlDotNet": { + "type": "Transitive", + "resolved": "16.3.0", + "contentHash": "SgMOdxbz8X65z8hraIs6hOEdnkH6hESTAIUa7viEngHOYaH+6q5XJmwr1+yb9vJpNQ19hCQY69xbFsLtXpobQA==" + }, + "CodeCargo.Nats.DistributedCache": { + "type": "Project", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "[9.0.4, )", + "Microsoft.Extensions.Logging.Abstractions": "[9.0.4, )", + "Microsoft.Extensions.Options": "[9.0.4, )", + "NATS.Client.KeyValueStore": "[2.6.0, )" + } + }, + "CodeCargo.Nats.HybridCacheExtensions": { + "type": "Project", + "dependencies": { + "CodeCargo.Nats.DistributedCache": "[1.0.0, )", + "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )" + } + } + } + } +} \ No newline at end of file diff --git a/util/RedisAppHost/packages.win-x64.lock.json b/util/RedisAppHost/packages.win-x64.lock.json new file mode 100644 index 0000000..ecde8eb --- /dev/null +++ b/util/RedisAppHost/packages.win-x64.lock.json @@ -0,0 +1,814 @@ +{ + "version": 1, + "dependencies": { + "net8.0": { + "Aspire.Dashboard.Sdk.win-x64": { + "type": "Direct", + "requested": "[9.2.1, )", + "resolved": "9.2.1", + "contentHash": "Ps8SfLO0BfNfKhthJ8o+3Rd6ritF2eCafCcWW9vfdT9wcMvn9pujPWPMJo6XVjk1C3zHrPyva9UMTbOT48HKTg==" + }, + "Aspire.Hosting.AppHost": { + "type": "Direct", + "requested": "[9.2.1, )", + "resolved": "9.2.1", + "contentHash": "fnJKXvMD82ma7nEug+b9BZq0zUcyD+TJZei+f7BWkfRrTKznch56P2hNWmQHCRG0ZicTB6SbKuRtVa3i7uFf1Q==", + "dependencies": { + "AspNetCore.HealthChecks.Uris": "9.0.0", + "Aspire.Hosting": "9.2.1", + "Google.Protobuf": "3.30.1", + "Grpc.AspNetCore": "2.70.0", + "Grpc.Net.ClientFactory": "2.70.0", + "Grpc.Tools": "2.71.0", + "Humanizer.Core": "2.14.1", + "JsonPatch.Net": "3.3.0", + "KubernetesClient": "16.0.2", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.2", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.15", + "Microsoft.Extensions.Hosting": "8.0.1", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.1", + "Microsoft.Extensions.Http": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.3", + "Microsoft.Extensions.Options": "8.0.2", + "Microsoft.Extensions.Primitives": "8.0.0", + "Newtonsoft.Json": "13.0.3", + "Polly.Core": "8.5.2", + "StreamJsonRpc": "2.21.69", + "System.IO.Hashing": "9.0.3" + } + }, + "Aspire.Hosting.Orchestration.win-x64": { + "type": "Direct", + "requested": "[9.2.1, )", + "resolved": "9.2.1", + "contentHash": "zql5k3nKMwCBfpODLt/sy/nKsZM272+LV67e3ehv9Ec2+0mUuPRs2DGx9mzvh7sBYBq53pF7A7pn9E3V6FkOXw==" + }, + "Aspire.Hosting.Redis": { + "type": "Direct", + "requested": "[9.2.1, )", + "resolved": "9.2.1", + "contentHash": "t/hsyOcxp2C03eWke7it9psgSajaUBDILjW3dWzw+S7OCd7lGrLzhbXEtq0wEcQXB3vnqKqRMnMZCTmRtnZswA==", + "dependencies": { + "AspNetCore.HealthChecks.Redis": "9.0.0", + "AspNetCore.HealthChecks.Uris": "9.0.0", + "Aspire.Hosting": "9.2.1", + "Google.Protobuf": "3.30.1", + "Grpc.AspNetCore": "2.70.0", + "Grpc.Net.ClientFactory": "2.70.0", + "Grpc.Tools": "2.71.0", + "Humanizer.Core": "2.14.1", + "JsonPatch.Net": "3.3.0", + "KubernetesClient": "16.0.2", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.2", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.15", + "Microsoft.Extensions.Hosting": "8.0.1", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.1", + "Microsoft.Extensions.Http": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.3", + "Microsoft.Extensions.Options": "8.0.2", + "Microsoft.Extensions.Primitives": "8.0.0", + "Newtonsoft.Json": "13.0.3", + "Polly.Core": "8.5.2", + "StackExchange.Redis": "2.8.31", + "StreamJsonRpc": "2.21.69", + "System.IO.Hashing": "9.0.3" + } + }, + "StyleCop.Analyzers": { + "type": "Direct", + "requested": "[1.2.0-beta.556, )", + "resolved": "1.2.0-beta.556", + "contentHash": "llRPgmA1fhC0I0QyFLEcjvtM2239QzKr/tcnbsjArLMJxJlu0AA5G7Fft0OI30pHF3MW63Gf4aSSsjc5m82J1Q==", + "dependencies": { + "StyleCop.Analyzers.Unstable": "1.2.0.556" + } + }, + "Aspire.Hosting": { + "type": "Transitive", + "resolved": "9.2.1", + "contentHash": "Awidk6C7nris+LT3Yq48oihv5uVbGmP/4rpO1sLxvxwuxSXEnPkrB2MTGCCqr3Z/e68u9J54s6p8RBdIYwTe0w==", + "dependencies": { + "AspNetCore.HealthChecks.Uris": "9.0.0", + "Google.Protobuf": "3.30.1", + "Grpc.AspNetCore": "2.70.0", + "Grpc.Net.ClientFactory": "2.70.0", + "Grpc.Tools": "2.71.0", + "Humanizer.Core": "2.14.1", + "JsonPatch.Net": "3.3.0", + "KubernetesClient": "16.0.2", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.2", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.15", + "Microsoft.Extensions.Hosting": "8.0.1", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.1", + "Microsoft.Extensions.Http": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.3", + "Microsoft.Extensions.Options": "8.0.2", + "Microsoft.Extensions.Primitives": "8.0.0", + "Newtonsoft.Json": "13.0.3", + "Polly.Core": "8.5.2", + "StreamJsonRpc": "2.21.69", + "System.IO.Hashing": "9.0.3" + } + }, + "AspNetCore.HealthChecks.Redis": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "yNH0h8GLRbAf+PU5HNVLZ5hNeyq9mDVmRKO9xuZsme/znUYoBJlQvI0gq45gaZNlLncCHkMhR4o90MuT+gxxPw==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.11", + "StackExchange.Redis": "2.7.4" + } + }, + "AspNetCore.HealthChecks.Uris": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "XYdNlA437KeF8p9qOpZFyNqAN+c0FXt/JjTvzH/Qans0q0O3pPE8KPnn39ucQQjR/Roum1vLTP3kXiUs8VHyuA==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.11", + "Microsoft.Extensions.Http": "8.0.0" + } + }, + "Fractions": { + "type": "Transitive", + "resolved": "7.3.0", + "contentHash": "2bETFWLBc8b7Ut2SVi+bxhGVwiSpknHYGBh2PADyGWONLkTxT7bKyDRhF8ao+XUv90tq8Fl7GTPxSI5bacIRJw==" + }, + "Google.Protobuf": { + "type": "Transitive", + "resolved": "3.30.1", + "contentHash": "HeWXDQBabQn/sCGicbeLJ0HMunknfC4FdLrOQOsaMJHcpqx3HVIpyyJqTrqJlWnza870twhOb+rBcaTiC/TlNA==" + }, + "Grpc.AspNetCore": { + "type": "Transitive", + "resolved": "2.70.0", + "contentHash": "s29ST5F2/PZLzOnfqfeDn0emAZajBtYnV9G7hkbK8Eu9+XphoL3KfiEsg2eBsx7P9YYQXcksDbE+CbHApMZeJA==", + "dependencies": { + "Google.Protobuf": "3.27.0", + "Grpc.AspNetCore.Server.ClientFactory": "2.70.0", + "Grpc.Tools": "2.70.0" + } + }, + "Grpc.AspNetCore.Server": { + "type": "Transitive", + "resolved": "2.70.0", + "contentHash": "9d6JuMLSxwOX4zERV7HBwq1XL8DD48a6FSoxD5dDXrCz/o0HqMXE2+lRcXHckOlz1JCesznW8XMMJdsU1FfY7w==", + "dependencies": { + "Grpc.Net.Common": "2.70.0" + } + }, + "Grpc.AspNetCore.Server.ClientFactory": { + "type": "Transitive", + "resolved": "2.70.0", + "contentHash": "k4GrvUAgVWm7DyhnV55MHdX4bQSpZVEQmlZO3bdSmGZ+z6Hx+CwDlhqiReczCm6qbzSUbS1YW0t7z7UEObTwKA==", + "dependencies": { + "Grpc.AspNetCore.Server": "2.70.0", + "Grpc.Net.ClientFactory": "2.70.0" + } + }, + "Grpc.Core.Api": { + "type": "Transitive", + "resolved": "2.70.0", + "contentHash": "66UotvWcSIq41oiQhLWcQACyKPM4umxXNiht5DQTLZJfNwEswWOcS7Z0xIEHyNIBE7ZpjotH22bEjTkvhPxmVw==" + }, + "Grpc.Net.Client": { + "type": "Transitive", + "resolved": "2.70.0", + "contentHash": "xNv0FFCVJa5S1beUtye82WFCxKThuE1jbN8DO1x1Rj8VSIWXLBUmfSID5a1fGzsU2R/EMfwPoWclJ2RMfQuGXw==", + "dependencies": { + "Grpc.Net.Common": "2.70.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0" + } + }, + "Grpc.Net.ClientFactory": { + "type": "Transitive", + "resolved": "2.70.0", + "contentHash": "Qg+93oj/8RdEw3PnLZNNYWnWCWyJYC/ZYZcjeln/pLaxLaPvdXES1peiqSJUI4wLFZ1JwGlbWt8+nM1i2E7ihg==", + "dependencies": { + "Grpc.Net.Client": "2.70.0", + "Microsoft.Extensions.Http": "6.0.0" + } + }, + "Grpc.Net.Common": { + "type": "Transitive", + "resolved": "2.70.0", + "contentHash": "rBdEUMyCwa+iB8mqC6JKyPbj3SBHHkReJj/yy/XKJI63GcG6w9DJMMGTVcYHqq4Ci2W4m0HT4jt2pFfFscar8g==", + "dependencies": { + "Grpc.Core.Api": "2.70.0" + } + }, + "Grpc.Tools": { + "type": "Transitive", + "resolved": "2.71.0", + "contentHash": "r8zHZm7kHdMrtujnkcuQ0BNDH2969at/8Va1ZzQgVblaQzR7tm8JlA3G+5Z5IFbvvf9PcAr1/VcoSR+g7j4Nyw==" + }, + "Humanizer.Core": { + "type": "Transitive", + "resolved": "2.14.1", + "contentHash": "lQKvtaTDOXnoVJ20ibTuSIOf2i0uO0MPbDhd1jm238I+U/2ZnRENj0cktKZhtchBMtCUSRQ5v4xBCUbKNmyVMw==" + }, + "IdentityModel": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "to99aLL5Gev1GOb2gUao/UZXT/uXMyjEmHPNrf/vJI2HBD1LMCTeC4SBCe/cqMIB12V9v+eSieq7ff0lju9pOQ==" + }, + "IdentityModel.OidcClient": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "m2PZbjeG3nXIQ72NLZvFz3FLFk7GmqLnxO/ifUvaTEE3BDZXp7DXAdjDP6TQKaL20+wDnej2ffA1Yh3vVcJOkA==", + "dependencies": { + "IdentityModel": "7.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0" + } + }, + "Json.More.Net": { + "type": "Transitive", + "resolved": "2.1.0", + "contentHash": "qtwsyAsL55y2vB2/sK4Pjg3ZyVzD5KKSpV3lOAMHlnjFfsjQ/86eHJfQT9aV1YysVXzF4+xyHOZbh7Iu3YQ7Lg==" + }, + "JsonPatch.Net": { + "type": "Transitive", + "resolved": "3.3.0", + "contentHash": "GIcMMDtzfzVfIpQgey8w7dhzcw6jG5nD4DDAdQCTmHfblkCvN7mI8K03to8YyUhKMl4PTR6D6nLSvWmyOGFNTg==", + "dependencies": { + "JsonPointer.Net": "5.2.0" + } + }, + "JsonPointer.Net": { + "type": "Transitive", + "resolved": "5.2.0", + "contentHash": "qe1F7Tr/p4mgwLPU9P60MbYkp+xnL2uCPnWXGgzfR/AZCunAZIC0RZ32dLGJJEhSuLEfm0YF/1R3u5C7mEVq+w==", + "dependencies": { + "Humanizer.Core": "2.14.1", + "Json.More.Net": "2.1.0" + } + }, + "KubernetesClient": { + "type": "Transitive", + "resolved": "16.0.2", + "contentHash": "MTec7O7S23OtffS7lGnt75Q3h2/Jdl+y54uoJyP6MeGnvzeuAGq5n8QSaqUkLvDILvD92FS5kcEqpiCr79UnWQ==", + "dependencies": { + "Fractions": "7.3.0", + "IdentityModel.OidcClient": "6.0.0", + "System.IdentityModel.Tokens.Jwt": "8.3.0", + "YamlDotNet": "16.3.0" + } + }, + "MessagePack": { + "type": "Transitive", + "resolved": "2.5.192", + "contentHash": "Jtle5MaFeIFkdXtxQeL9Tu2Y3HsAQGoSntOzrn6Br/jrl6c8QmG22GEioT5HBtZJR0zw0s46OnKU8ei2M3QifA==", + "dependencies": { + "MessagePack.Annotations": "2.5.192", + "Microsoft.NET.StringTools": "17.6.3" + } + }, + "MessagePack.Annotations": { + "type": "Transitive", + "resolved": "2.5.192", + "contentHash": "jaJuwcgovWIZ8Zysdyf3b7b34/BrADw4v82GaEZymUhDd3ScMPrYd/cttekeDteJJPXseJxp04yTIcxiVUjTWg==" + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "3WA9q9yVqJp222P3x1wYIGDAkpjAku0TMUaaQV22g6L67AI0LdOIrVS7Ht2vJfLHGSPVuqN94vIr15qn+HEkHw==" + }, + "Microsoft.Extensions.Caching.Abstractions": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "imcZ5BGhBw5mNsWLepBbqqumWaFe0GtvyCvne2/2wsDIBRa2+Lhx4cU/pKt/4BwOizzUEOls2k1eOJQXHGMalg==", + "dependencies": { + "Microsoft.Extensions.Primitives": "9.0.4" + } + }, + "Microsoft.Extensions.Caching.Hybrid": { + "type": "Transitive", + "resolved": "9.4.0", + "contentHash": "GtHP+DRraRM6RLq7TzUV8Iiyqm+WemJRLDNqy7uvA+Dgf6fjvxpmHnzgPb+RAcRNjADz961DMHHZ4i5EQjpDPw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.Caching.Memory": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "G5rEq1Qez5VJDTEyRsRUnewAspKjaY57VGsdZ8g8Ja6sXXzoiI3PpTd1t43HjHqNWD5A06MQveb2lscn+2CU+w==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4", + "Microsoft.Extensions.Primitives": "9.0.4" + } + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "0J/9YNXTMWSZP2p2+nvl8p71zpSwokZXZuJW+VjdErkegAnFdO1XlqtA62SJtgVYHdKu3uPxJHcMR/r35HwFBA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "8.0.2", + "contentHash": "7IQhGK+wjyGrNsPBjJcZwWAr+Wf6D4+TwOptUt77bWtgNkiV8tDEbhFS+dDamtQFZ2X7kWG9m71iZQRj2x3zgQ==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.CommandLine": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "NZuZMz3Q8Z780nKX3ifV1fE7lS+6pynDHK71OfU4OZ1ItgvDOhyOC7E6z+JMZrAj63zRpwbdldYFk499t3+1dQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.EnvironmentVariables": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "plvZ0ZIpq+97gdPNNvhwvrEZ92kNml9hd1pe3idMA7svR0PztdzVLkoWLcRFgySYXUJc3kSM3Xw3mNFMo/bxRA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.FileExtensions": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "EJzSNO9oaAXnTdtdNO6npPRsIIeZCBSNmdQ091VDO7fBiOtJAAeEq6dtrVXIi3ZyjC5XRSAtVvF8SzcneRHqKQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Physical": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.Json": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "L89DLNuimOghjV3tLx0ArFDwVEJD6+uGB3BMCMX01kaLzXkaXHb2021xOMl2QOxUxbdePKUZsUY7n2UUkycjRg==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.FileExtensions": "8.0.1", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.UserSecrets": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "7tYqdPPpAK+3jO9d5LTuCK2VxrEdf85Ol4trUr6ds4jclBecadWZ/RyPCbNjfbN5iGTfUnD/h65TOQuqQv2c+A==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Json": "8.0.1", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Physical": "8.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "BmANAnR5Xd4Oqw7yQ75xOAYODybZQRzdeNucg7kS5wWKd2PNnMdYtJ2Vciy0QLylRmv42DGl5+AFL9izA6F1Rw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "UI0TQPVkS78bFdjkTodmkH0Fe8lXv9LnhGFKgKrsgUJ5a5FVdFRcgjIkBVLbGgdRhxWirxH/8IXUtEyYJx6GQg==" + }, + "Microsoft.Extensions.Diagnostics": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "doVPCUUCY7c6LhBsEfiy3W1bvS7Mi6LkfQMS8nlC22jZWNxBv8VO8bdfeyvpYFst6Kxqk7HBC6lytmEoBssvSQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.1", + "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0" + } + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "elH2vmwNmsXuKmUeMQ4YW9ldXiF+gSGDgg1vORksob5POnpaI6caj1Hu8zaYbEuibhqCoWg0YRWDazBY3zjBfg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.Extensions.Diagnostics.HealthChecks": { + "type": "Transitive", + "resolved": "8.0.15", + "contentHash": "+Z6pfO5PnDa9/QCAB8DhmLtmjh0Z4A3i/5X5k3TBqKjCD4o88oUoyI240ras/LDsrFcjYXVLDsBZbuoN9ihjuw==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "8.0.15", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.3", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { + "type": "Transitive", + "resolved": "8.0.15", + "contentHash": "FkN4TMmKdpvuwhBlt7rt7op1RyyHvS/obnHAIOes0+cYU5uBiz7ciYpGkLZmbKGvRm9tUEfB9HpEg27kIwvXEQ==" + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.FileProviders.Physical": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "UboiXxpPUpwulHvIAVE36Knq0VSHaAmfrFkegLyBZeaADuKezJ/AIXYAW8F5GBlGk/VaibN2k/Zn1ca8YAfVdA==", + "dependencies": { + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileSystemGlobbing": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.FileSystemGlobbing": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "OK+670i7esqlQrPjdIKRbsyMCe9g5kSLpRRQGSr4Q58AOYEe/hCnfLZprh7viNisSUUQZmMrbbuDaIrP+V1ebQ==" + }, + "Microsoft.Extensions.Hosting": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "bP9EEkHBEfjgYiG8nUaXqMk/ujwJrffOkNPP7onpRMO8R+OUSESSP4xHkCAXgYZ1COP2Q9lXlU5gkMFh20gRuw==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.2", + "Microsoft.Extensions.Configuration.CommandLine": "8.0.0", + "Microsoft.Extensions.Configuration.EnvironmentVariables": "8.0.0", + "Microsoft.Extensions.Configuration.FileExtensions": "8.0.1", + "Microsoft.Extensions.Configuration.Json": "8.0.1", + "Microsoft.Extensions.Configuration.UserSecrets": "8.0.1", + "Microsoft.Extensions.DependencyInjection": "8.0.1", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Diagnostics": "8.0.1", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Physical": "8.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.1", + "Microsoft.Extensions.Logging": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Logging.Configuration": "8.0.1", + "Microsoft.Extensions.Logging.Console": "8.0.1", + "Microsoft.Extensions.Logging.Debug": "8.0.1", + "Microsoft.Extensions.Logging.EventLog": "8.0.1", + "Microsoft.Extensions.Logging.EventSource": "8.0.1", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.Extensions.Hosting.Abstractions": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "nHwq9aPBdBPYXPti6wYEEfgXddfBrYC+CQLn+qISiwQq5tpfaqDZSKOJNxoe9rfQxGf1c+2wC/qWFe1QYJPYqw==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.1", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2" + } + }, + "Microsoft.Extensions.Http": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "kDYeKJUzh0qeg/AI+nSr3ffthmXYQTEb0nS9qRC7YhSbbuN4M4NPbaB77AJwtkTnCV9XZ7qYj3dkZaNcyl73EA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Diagnostics": "8.0.1", + "Microsoft.Extensions.Logging": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "4x+pzsQEbqxhNf1QYRr5TDkLP9UsLT3A6MdRKDDEgrW7h1ljiEPgTNhKYUhNCCAaVpQECVQ+onA91PTPnIp6Lw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "0MXlimU4Dud6t+iNi5NEz3dO2w1HXdhoOLaYFuLPCjAsvlPQGwOT6V2KZRMLEhCAm/stSZt1AUv0XmDdkjvtbw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", + "System.Diagnostics.DiagnosticSource": "9.0.4" + } + }, + "Microsoft.Extensions.Logging.Configuration": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "QWwTrsgOnJMmn+XUslm8D2H1n3PkP/u/v52FODtyBc/k4W9r3i2vcXXeeX/upnzllJYRRbrzVzT0OclfNJtBJA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.2", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Logging": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Options": "8.0.2", + "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0" + } + }, + "Microsoft.Extensions.Logging.Console": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "uzcg/5U2eLyn5LIKlERkdSxw6VPC1yydnOSQiRRWGBGN3kphq3iL4emORzrojScDmxRhv49gp5BI8U3Dz7y4iA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Logging": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Logging.Configuration": "8.0.1", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.Extensions.Logging.Debug": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "B8hqNuYudC2RB+L/DI33uO4rf5by41fZVdcVL2oZj0UyoAZqnwTwYHp1KafoH4nkl1/23piNeybFFASaV2HkFg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Logging": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2" + } + }, + "Microsoft.Extensions.Logging.EventLog": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "ZD1m4GXoxcZeDJIq8qePKj+QAWeQNO/OG8skvrOG8RQfxLp9MAKRoliTc27xanoNUzeqvX5HhS/I7c0BvwAYUg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Logging": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Options": "8.0.2", + "System.Diagnostics.EventLog": "8.0.1" + } + }, + "Microsoft.Extensions.Logging.EventSource": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "YMXMAla6B6sEf/SnfZYTty633Ool3AH7KOw2LOaaEqwSo2piK4f7HMtzyc3CNiipDnq1fsUSuG5Oc7ZzpVy8WQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Logging": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Options": "8.0.2", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "fiFI2+58kicqVZyt/6obqoFwHiab7LC4FkQ3mmiBJ28Yy4fAvy2+v9MRnSvvlOO8chTOjKsdafFl/K9veCPo5g==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", + "Microsoft.Extensions.Primitives": "9.0.4" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "0f4DMRqEd50zQh+UyJc+/HiBsZ3vhAQALgdkcQEalSH1L2isdC7Yj54M3cyo5e+BeO5fcBQ7Dxly8XiBBcvRgw==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "SPFyMjyku1nqTFFJ928JAMd0QnRe4xjE7KeKnZMWXf3xk+6e0WiOZAluYtLdbJUXtsl2cCRSi8cBquJ408k8RA==" + }, + "Microsoft.IdentityModel.Abstractions": { + "type": "Transitive", + "resolved": "8.3.0", + "contentHash": "jNin7yvWZu+K3U24q+6kD+LmGSRfbkHl9Px8hN1XrGwq6ZHgKGi/zuTm5m08G27fwqKfVXIWuIcUeq4Y1VQUOg==" + }, + "Microsoft.IdentityModel.JsonWebTokens": { + "type": "Transitive", + "resolved": "8.3.0", + "contentHash": "4SVXLT8sDG7CrHiszEBrsDYi+aDW0W9d+fuWUGdZPBdan56aM6fGXJDjbI0TVGEDjJhXbACQd8F/BnC7a+m2RQ==", + "dependencies": { + "Microsoft.IdentityModel.Tokens": "8.3.0" + } + }, + "Microsoft.IdentityModel.Logging": { + "type": "Transitive", + "resolved": "8.3.0", + "contentHash": "4w4pSIGHhCCLTHqtVNR2Cc/zbDIUWIBHTZCu/9ZHm2SVwrXY3RJMcZ7EFGiKqmKZMQZJzA0bpwCZ6R8Yb7i5VQ==", + "dependencies": { + "Microsoft.IdentityModel.Abstractions": "8.3.0" + } + }, + "Microsoft.IdentityModel.Tokens": { + "type": "Transitive", + "resolved": "8.3.0", + "contentHash": "yGzqmk+kInH50zeSEH/L1/J0G4/yqTQNq4YmdzOhpE7s/86tz37NS2YbbY2ievbyGjmeBI1mq26QH+yBR6AK3Q==", + "dependencies": { + "Microsoft.IdentityModel.Logging": "8.3.0" + } + }, + "Microsoft.NET.StringTools": { + "type": "Transitive", + "resolved": "17.6.3", + "contentHash": "N0ZIanl1QCgvUumEL1laasU0a7sOE5ZwLZVTn0pAePnfhq8P7SvTjF8Axq+CnavuQkmdQpGNXQ1efZtu5kDFbA==" + }, + "Microsoft.VisualStudio.Threading.Only": { + "type": "Transitive", + "resolved": "17.13.61", + "contentHash": "vl5a2URJYCO5m+aZZtNlAXAMz28e2pUotRuoHD7RnCWOCeoyd8hWp5ZBaLNYq4iEj2oeJx5ZxiSboAjVmB20Qg==", + "dependencies": { + "Microsoft.VisualStudio.Validation": "17.8.8" + } + }, + "Microsoft.VisualStudio.Validation": { + "type": "Transitive", + "resolved": "17.8.8", + "contentHash": "rWXThIpyQd4YIXghNkiv2+VLvzS+MCMKVRDR0GAMlflsdo+YcAN2g2r5U1Ah98OFjQMRexTFtXQQ2LkajxZi3g==" + }, + "NATS.Client.Core": { + "type": "Transitive", + "resolved": "2.6.0", + "contentHash": "6mh+fSB9Fx6QfbYRjvswbWDgD04ePBYzB2yIY5GqzyUiUboqxpuOUDO2QOTNkwIqi8IpTMKcySAY+V/DvmvtQA==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "6.0.1", + "Microsoft.Extensions.Primitives": "6.0.0", + "System.IO.Pipelines": "8.0.0", + "System.Text.Json": "8.0.5" + } + }, + "NATS.Client.JetStream": { + "type": "Transitive", + "resolved": "2.6.0", + "contentHash": "3t5UJyN6nnsrDxWBxklNK06rnNL9aEjnzcOHCXRcZpcfFGeWFm4dG5UXtt7WiW69uWY4MHUlOcbuBKh5/rAuSQ==", + "dependencies": { + "NATS.Client.Core": "2.6.0" + } + }, + "NATS.Client.KeyValueStore": { + "type": "Transitive", + "resolved": "2.6.0", + "contentHash": "/us915HAGYdGAdblH2857w3xapZupmU4vNDODMfysgcg/tLineOtQ2+FqcSrmCVJ6mILngeuHGTk5vghunTpog==", + "dependencies": { + "NATS.Client.JetStream": "2.6.0" + } + }, + "Nerdbank.Streams": { + "type": "Transitive", + "resolved": "2.11.90", + "contentHash": "7jrOfU6b/PVBccqzNLfw9u84WWzkSpvWLb2mZxvwdQkOx/V9FXWkmnp/rjOnBFDOhrO/ev4+gQ5QS13FkgNSBA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "8.0.0", + "Microsoft.VisualStudio.Threading.Only": "17.13.61", + "Microsoft.VisualStudio.Validation": "17.8.8", + "System.IO.Pipelines": "8.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.1.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.3", + "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" + }, + "Pipelines.Sockets.Unofficial": { + "type": "Transitive", + "resolved": "2.2.8", + "contentHash": "zG2FApP5zxSx6OcdJQLbZDk2AVlN2BNQD6MorwIfV6gVj0RRxWPEp2LXAxqDGZqeNV1Zp0BNPcNaey/GXmTdvQ==", + "dependencies": { + "System.IO.Pipelines": "5.0.1" + } + }, + "Polly.Core": { + "type": "Transitive", + "resolved": "8.5.2", + "contentHash": "1MJKdxv4zwDmiWvYvVN24DsrWUfgQ4F83voH8bhbtLMdPuGy8CfTUzsgQhvyrl1a7hrM6f/ydwLVdVUI0xooUw==" + }, + "StackExchange.Redis": { + "type": "Transitive", + "resolved": "2.8.31", + "contentHash": "RCHVQa9Zke8k0oBgJn1Yl6BuYy8i6kv+sdMObiH60nOwD6QvWAjxdDwOm+LO78E8WsGiPqgOuItkz98fPS6haQ==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Pipelines.Sockets.Unofficial": "2.2.8" + } + }, + "StreamJsonRpc": { + "type": "Transitive", + "resolved": "2.21.69", + "contentHash": "WbTpn/PIo+HpFYnsOCiOOe0kHUE2N1eiVRi7MO70DFBTMG3pAOfrgHtwUpOJ37dfDETq/9P9WNIbHom4ABZfrA==", + "dependencies": { + "MessagePack": "2.5.192", + "Microsoft.Bcl.AsyncInterfaces": "8.0.0", + "Microsoft.VisualStudio.Threading.Only": "17.13.61", + "Microsoft.VisualStudio.Validation": "17.8.8", + "Nerdbank.Streams": "2.11.90", + "Newtonsoft.Json": "13.0.3", + "System.IO.Pipelines": "8.0.0" + } + }, + "StyleCop.Analyzers.Unstable": { + "type": "Transitive", + "resolved": "1.2.0.556", + "contentHash": "zvn9Mqs/ox/83cpYPignI8hJEM2A93s2HkHs8HYMOAQW0PkampyoErAiIyKxgTLqbbad29HX/shv/6LGSjPJNQ==" + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "Be0emq8bRmcK4eeJIFUt9+vYPf7kzuQrFs8Ef1CdGvXpq/uSve22PTSkRF09bF/J7wmYJ2DHf2v7GaT3vMXnwQ==" + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "n1ZP7NM2Gkn/MgD8+eOT5MulMj6wfeQMNS2Pizvq5GHCZfjlFMXV2irQlQmJhwA2VABC57M0auudO89Iu2uRLg==" + }, + "System.IdentityModel.Tokens.Jwt": { + "type": "Transitive", + "resolved": "8.3.0", + "contentHash": "9GESpDG0Zb17HD5mBW/uEWi2yz/uKPmCthX2UhyLnk42moGH2FpMgXA2Y4l2Qc7P75eXSUTA6wb/c9D9GSVkzw==", + "dependencies": { + "Microsoft.IdentityModel.JsonWebTokens": "8.3.0", + "Microsoft.IdentityModel.Tokens": "8.3.0" + } + }, + "System.IO.Hashing": { + "type": "Transitive", + "resolved": "9.0.3", + "contentHash": "BrMGzDRLz410PE4qC8UeKeAc0hFRjBkiCUOLTwuod65NAjqg5tDNqYU7gP0A09taEXtecB+HJc1NNnnTjsKFAQ==" + }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.1.0", + "contentHash": "5o/HZxx6RVqYlhKSq8/zronDkALJZUT2Vz0hx43f0gwe8mwlM0y2nYlqdBwLMzr262Bwvpikeb/yEwkAa5PADg==" + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "8.0.5", + "contentHash": "0f1B50Ss7rqxXiaBJyzUu9bWFOO2/zSlifZ/UNMdiIpDYe4cY4LQQicP4nirK1OS31I43rn062UIJ1Q9bpmHpg==" + }, + "YamlDotNet": { + "type": "Transitive", + "resolved": "16.3.0", + "contentHash": "SgMOdxbz8X65z8hraIs6hOEdnkH6hESTAIUa7viEngHOYaH+6q5XJmwr1+yb9vJpNQ19hCQY69xbFsLtXpobQA==" + }, + "CodeCargo.Nats.DistributedCache": { + "type": "Project", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "[9.0.4, )", + "Microsoft.Extensions.Logging.Abstractions": "[9.0.4, )", + "Microsoft.Extensions.Options": "[9.0.4, )", + "NATS.Client.KeyValueStore": "[2.6.0, )" + } + }, + "CodeCargo.Nats.HybridCacheExtensions": { + "type": "Project", + "dependencies": { + "CodeCargo.Nats.DistributedCache": "[1.0.0, )", + "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )" + } + } + } + } +} \ No newline at end of file From 10b27b36f8256707ebcf68a45604a57d6e5d46ab Mon Sep 17 00:00:00 2001 From: Caleb Lloyd Date: Mon, 19 May 2025 00:02:58 -0400 Subject: [PATCH 2/5] perf test providers Signed-off-by: Caleb Lloyd --- util/PerfTest/Program.cs | 142 +----------------- .../PerfTest/TestProvider/BaseTestProvider.cs | 91 +++++++++++ .../PerfTest/TestProvider/NatsTestProvider.cs | 52 +++++++ .../TestProvider/RedisTestProvider.cs | 31 ++++ 4 files changed, 182 insertions(+), 134 deletions(-) diff --git a/util/PerfTest/Program.cs b/util/PerfTest/Program.cs index bb8c6ab..20f73be 100644 --- a/util/PerfTest/Program.cs +++ b/util/PerfTest/Program.cs @@ -1,136 +1,10 @@ -using Aspire.Hosting.ApplicationModel; -using Aspire.Hosting.Testing; -using CodeCargo.Nats.DistributedCache; -using CodeCargo.Nats.DistributedCache.PerfTest; -using CodeCargo.Nats.DistributedCache.TestUtils; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using NATS.Client.Core; -using NATS.Client.JetStream.Models; -using NATS.Client.KeyValueStore; -using NATS.Net; +using CodeCargo.Nats.DistributedCache.PerfTest.TestProvider; -// Timeouts -var aspireStartupTimeout = TimeSpan.FromSeconds(30); -var appStartupTimeout = TimeSpan.FromSeconds(30); -var appShutdownTimeout = TimeSpan.FromSeconds(10); -var perfTestTimeout = TimeSpan.FromMinutes(1); +BaseTestProvider provider; +Console.WriteLine("Select test provider:"); +Console.WriteLine("1) NATS (default)"); +Console.WriteLine("2) Redis"); +var choice = Console.ReadLine(); +provider = choice?.Trim() == "2" ? new RedisTestProvider() : new NatsTestProvider(); -// Start the NatsAppHost application -Console.WriteLine("Starting Aspire..."); -var aspireAppHost = await DistributedApplicationTestingBuilder.CreateAsync(); -var aspireApp = await aspireAppHost.BuildAsync(); -await aspireApp.StartAsync(); - -// Wait for the NATS resource to be healthy before proceeding -var resourceNotificationService = aspireApp.Services.GetRequiredService(); -using var startupCts = new CancellationTokenSource(aspireStartupTimeout); -await resourceNotificationService.WaitForResourceHealthyAsync("Nats", startupCts.Token); -Console.WriteLine("Aspire started"); - -// Get NATS connection string from Aspire -var natsConnectionString = await aspireApp.GetConnectionStringAsync("Nats", cancellationToken: startupCts.Token); -if (string.IsNullOrEmpty(natsConnectionString)) -{ - throw new InvalidOperationException("Cannot find connection string for NATS"); -} - -// Create a host builder for a console application -var builder = Host.CreateDefaultBuilder(args); - -// Add services directly to the builder -builder.ConfigureServices(services => -{ - services.AddNatsTestClient(natsConnectionString); - services.AddNatsDistributedCache(options => options.BucketName = "cache"); - services.AddScoped(); -}); - -// Build the host -var host = builder.Build(); -var lifetime = host.Services.GetRequiredService(); - -// Create KV store -Console.WriteLine("Creating KV store..."); -var nats = host.Services.GetRequiredService(); -var kv = nats.CreateKeyValueStoreContext(); -await kv.CreateOrUpdateStoreAsync( - new NatsKVConfig("cache") - { - LimitMarkerTTL = TimeSpan.FromSeconds(1), - Storage = NatsKVStorageType.Memory - }, - startupCts.Token); -await nats - .CreateJetStreamContext() - .PurgeStreamAsync("KV_cache", new StreamPurgeRequest(), startupCts.Token); -Console.WriteLine("KV store created"); - -// Run the host -Console.WriteLine("Starting app..."); -using var appCts = new CancellationTokenSource(); -var appTask = Task.Run(async () => -{ - try - { - await host.RunAsync(appCts.Token); - } - catch (OperationCanceledException) when (appCts.IsCancellationRequested) - { - // ignore - } -}); - -try -{ - try - { - // startup - using (var cts = new CancellationTokenSource(appStartupTimeout)) - { - using var linkedCts = CancellationTokenSource.CreateLinkedTokenSource( - cts.Token, - lifetime.ApplicationStarted); - try - { - await Task.Delay(appStartupTimeout, linkedCts.Token); - } - catch (OperationCanceledException) when (lifetime.ApplicationStarted.IsCancellationRequested) - { - Console.WriteLine("App Started"); - } - } - - using (var cts = new CancellationTokenSource(perfTestTimeout)) - { - using var linkedCts = CancellationTokenSource.CreateLinkedTokenSource( - cts.Token, - lifetime.ApplicationStopping); - using var scope = host.Services.CreateScope(); - var perfTest = scope.ServiceProvider.GetRequiredService(); - await perfTest.Run(linkedCts.Token); - } - } - catch (OperationCanceledException) when (lifetime.ApplicationStopping.IsCancellationRequested) - { - // ignore - } - - await appCts.CancelAsync(); - await appTask; -} -finally -{ - // Clean up resources - using var stopCts = new CancellationTokenSource(appShutdownTimeout); - try - { - await aspireApp.StopAsync(stopCts.Token); - } - catch (Exception ex) - { - await Console.Error.WriteLineAsync($"Error stopping application: {ex.Message}"); - } - - await aspireApp.DisposeAsync(); -} +await provider.RunAsync(args); diff --git a/util/PerfTest/TestProvider/BaseTestProvider.cs b/util/PerfTest/TestProvider/BaseTestProvider.cs index 2aa95ac..044a2e9 100644 --- a/util/PerfTest/TestProvider/BaseTestProvider.cs +++ b/util/PerfTest/TestProvider/BaseTestProvider.cs @@ -1,6 +1,97 @@ +using Aspire.Hosting; +using Aspire.Hosting.ApplicationModel; +using Aspire.Hosting.Testing; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; + namespace CodeCargo.Nats.DistributedCache.PerfTest.TestProvider; public abstract class BaseTestProvider { + protected virtual TimeSpan AspireStartupTimeout => TimeSpan.FromSeconds(30); + protected virtual TimeSpan AppStartupTimeout => TimeSpan.FromSeconds(30); + protected virtual TimeSpan AppShutdownTimeout => TimeSpan.FromSeconds(10); + protected virtual TimeSpan PerfTestTimeout => TimeSpan.FromMinutes(1); + + protected abstract Task<(DistributedApplication App, string ConnectionString)> StartDistributedApplicationAsync(CancellationToken ct); + protected abstract void RegisterServices(IServiceCollection services, string connectionString); + protected virtual Task AfterHostBuildAsync(IHost host, string connectionString, CancellationToken ct) => Task.CompletedTask; + + public async Task RunAsync(string[] args) + { + Console.WriteLine("Starting Aspire..."); + using var startupCts = new CancellationTokenSource(AspireStartupTimeout); + var (app, connectionString) = await StartDistributedApplicationAsync(startupCts.Token); + try + { + var builder = Host.CreateDefaultBuilder(args); + builder.ConfigureServices(services => + { + RegisterServices(services, connectionString); + services.AddScoped(); + }); + + var host = builder.Build(); + var lifetime = host.Services.GetRequiredService(); + + await AfterHostBuildAsync(host, connectionString, startupCts.Token); + + Console.WriteLine("Starting app..."); + using var appCts = new CancellationTokenSource(); + var appTask = Task.Run(async () => + { + try + { + await host.RunAsync(appCts.Token); + } + catch (OperationCanceledException) when (appCts.IsCancellationRequested) + { + } + }); + + try + { + using (var cts = new CancellationTokenSource(AppStartupTimeout)) + { + using var linked = CancellationTokenSource.CreateLinkedTokenSource(cts.Token, lifetime.ApplicationStarted); + try + { + await Task.Delay(AppStartupTimeout, linked.Token); + } + catch (OperationCanceledException) when (lifetime.ApplicationStarted.IsCancellationRequested) + { + Console.WriteLine("App Started"); + } + } + + using (var cts = new CancellationTokenSource(PerfTestTimeout)) + { + using var linked = CancellationTokenSource.CreateLinkedTokenSource(cts.Token, lifetime.ApplicationStopping); + using var scope = host.Services.CreateScope(); + var perfTest = scope.ServiceProvider.GetRequiredService(); + await perfTest.Run(linked.Token); + } + } + catch (OperationCanceledException) when (lifetime.ApplicationStopping.IsCancellationRequested) + { + } + + await appCts.CancelAsync(); + await appTask; + } + finally + { + using var stopCts = new CancellationTokenSource(AppShutdownTimeout); + try + { + await app.StopAsync(stopCts.Token); + } + catch (Exception ex) + { + await Console.Error.WriteLineAsync($"Error stopping application: {ex.Message}"); + } + await app.DisposeAsync(); + } + } } diff --git a/util/PerfTest/TestProvider/NatsTestProvider.cs b/util/PerfTest/TestProvider/NatsTestProvider.cs index 23352a3..57fd55f 100644 --- a/util/PerfTest/TestProvider/NatsTestProvider.cs +++ b/util/PerfTest/TestProvider/NatsTestProvider.cs @@ -1,6 +1,58 @@ +using Aspire.Hosting; +using Aspire.Hosting.ApplicationModel; +using Aspire.Hosting.Testing; +using CodeCargo.Nats.DistributedCache.TestUtils; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using NATS.Client.Core; +using NATS.Client.JetStream.Models; +using NATS.Client.KeyValueStore; +using NATS.Net; + namespace CodeCargo.Nats.DistributedCache.PerfTest.TestProvider; public class NatsTestProvider : BaseTestProvider { + protected override async Task<(DistributedApplication App, string ConnectionString)> StartDistributedApplicationAsync(CancellationToken ct) + { + var appHost = await DistributedApplicationTestingBuilder.CreateAsync(); + var app = await appHost.BuildAsync(); + await app.StartAsync(ct); + + var resourceNotificationService = app.Services.GetRequiredService(); + await resourceNotificationService.WaitForResourceHealthyAsync("Nats", ct); + + var connectionString = await app.GetConnectionStringAsync("Nats", cancellationToken: ct); + if (string.IsNullOrEmpty(connectionString)) + { + throw new InvalidOperationException("Cannot find connection string for NATS"); + } + + Console.WriteLine("Aspire started"); + return (app, connectionString); + } + + protected override void RegisterServices(IServiceCollection services, string connectionString) + { + services.AddNatsTestClient(connectionString); + services.AddNatsDistributedCache(options => options.BucketName = "cache"); + } + protected override async Task AfterHostBuildAsync(IHost host, string connectionString, CancellationToken ct) + { + Console.WriteLine("Creating KV store..."); + var nats = host.Services.GetRequiredService(); + var kv = nats.CreateKeyValueStoreContext(); + await kv.CreateOrUpdateStoreAsync( + new NatsKVConfig("cache") + { + LimitMarkerTTL = TimeSpan.FromSeconds(1), + Storage = NatsKVStorageType.Memory + }, + ct); + await nats + .CreateJetStreamContext() + .PurgeStreamAsync("KV_cache", new StreamPurgeRequest(), ct); + Console.WriteLine("KV store created"); + } } diff --git a/util/PerfTest/TestProvider/RedisTestProvider.cs b/util/PerfTest/TestProvider/RedisTestProvider.cs index 3f0c9b3..37746c3 100644 --- a/util/PerfTest/TestProvider/RedisTestProvider.cs +++ b/util/PerfTest/TestProvider/RedisTestProvider.cs @@ -1,6 +1,37 @@ +using Aspire.Hosting; +using Aspire.Hosting.ApplicationModel; +using Aspire.Hosting.Testing; +using Microsoft.Extensions.Caching.StackExchangeRedis; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; + namespace CodeCargo.Nats.DistributedCache.PerfTest.TestProvider; public class RedisTestProvider : BaseTestProvider { + protected override async Task<(DistributedApplication App, string ConnectionString)> StartDistributedApplicationAsync(CancellationToken ct) + { + var appHost = await DistributedApplicationTestingBuilder.CreateAsync(); + var app = await appHost.BuildAsync(); + await app.StartAsync(ct); + + var resourceNotificationService = app.Services.GetRequiredService(); + await resourceNotificationService.WaitForResourceHealthyAsync("Redis", ct); + + var connectionString = await app.GetConnectionStringAsync("Redis", cancellationToken: ct); + if (string.IsNullOrEmpty(connectionString)) + { + throw new InvalidOperationException("Cannot find connection string for Redis"); + } + + Console.WriteLine("Aspire started"); + return (app, connectionString); + } + + protected override void RegisterServices(IServiceCollection services, string connectionString) + { + services.AddStackExchangeRedisCache(options => options.Configuration = connectionString); + } + protected override Task AfterHostBuildAsync(IHost host, string connectionString, CancellationToken ct) => Task.CompletedTask; } From f9ec8eb0a8c4e01c1230649868f955c131e3ebdb Mon Sep 17 00:00:00 2001 From: Caleb Lloyd Date: Mon, 19 May 2025 13:11:43 -0400 Subject: [PATCH 3/5] working Signed-off-by: Caleb Lloyd --- util/PerfTest/Program.cs | 21 +++-- util/PerfTest/README.md | 56 ++++++++++++++ .../PerfTest/TestProvider/BaseTestProvider.cs | 50 ++++++------ .../PerfTest/TestProvider/NatsTestProvider.cs | 2 +- .../TestProvider/RedisTestProvider.cs | 76 +++++++++++++++---- util/RedisAppHost/Program.cs | 6 +- 6 files changed, 167 insertions(+), 44 deletions(-) create mode 100644 util/PerfTest/README.md diff --git a/util/PerfTest/Program.cs b/util/PerfTest/Program.cs index 20f73be..80548a0 100644 --- a/util/PerfTest/Program.cs +++ b/util/PerfTest/Program.cs @@ -1,10 +1,21 @@ using CodeCargo.Nats.DistributedCache.PerfTest.TestProvider; BaseTestProvider provider; -Console.WriteLine("Select test provider:"); -Console.WriteLine("1) NATS (default)"); -Console.WriteLine("2) Redis"); -var choice = Console.ReadLine(); -provider = choice?.Trim() == "2" ? new RedisTestProvider() : new NatsTestProvider(); + +// Check if Redis tests should be run based on command line args or environment variable +var useRedis = args.Contains("--redis") || + (Environment.GetEnvironmentVariable("TEST_REDIS")?.Equals("true", StringComparison.OrdinalIgnoreCase) ?? + false); + +if (useRedis) +{ + Console.WriteLine("Running Redis tests..."); + provider = new RedisTestProvider(); +} +else +{ + Console.WriteLine("Running NATS tests..."); + provider = new NatsTestProvider(); +} await provider.RunAsync(args); diff --git a/util/PerfTest/README.md b/util/PerfTest/README.md new file mode 100644 index 0000000..a539b8d --- /dev/null +++ b/util/PerfTest/README.md @@ -0,0 +1,56 @@ +# NATS/Redis Distributed Cache Performance Test + +This utility performs performance testing of distributed cache implementations, comparing NATS and Redis backends for the `IDistributedCache` interface in .NET. + +## Overview + +The performance test runs a series of operations against the distributed cache implementation: + +1. **Insert** - Adds items with absolute expiration +2. **Get** - Retrieves previously added items +3. **Update** - Updates items with sliding expiration +4. **Get (refresh)** - Retrieves item, extending sliding expiration +5. **Delete** - Removes items + +Each operation is timed and metrics are collected, including: +- Total operations completed +- Operations per second +- Data throughput +- P50/P95/P99 latency percentiles + +## Running Tests + +By default, the performance test runs against the NATS implementation: + +```bash +dotnet run -c Release +``` + +To run Redis tests instead, you can: + +```bash +# flag +dotnet run -c Release --redis + +# or env var +TEST_REDIS=true dotnet run -c Release +``` + +## Test Configuration + +The test performs operations on: +- 20,000 unique keys +- 128-byte value payload per key +- Parallelism based on the available processor count + +## Implementation Details + +The test uses Aspire's distributed application model to: +- Create and manage required infrastructure (NATS server or Redis instance) +- Configure the appropriate `IDistributedCache` implementation +- Run the performance tests in parallel +- Collect and display metrics + +The test providers are implemented as: +- `NatsTestProvider` - For NATS-backed distributed cache +- `RedisTestProvider` - For Redis-backed distributed cache diff --git a/util/PerfTest/TestProvider/BaseTestProvider.cs b/util/PerfTest/TestProvider/BaseTestProvider.cs index 044a2e9..79b5f62 100644 --- a/util/PerfTest/TestProvider/BaseTestProvider.cs +++ b/util/PerfTest/TestProvider/BaseTestProvider.cs @@ -1,6 +1,4 @@ using Aspire.Hosting; -using Aspire.Hosting.ApplicationModel; -using Aspire.Hosting.Testing; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; @@ -8,14 +6,10 @@ namespace CodeCargo.Nats.DistributedCache.PerfTest.TestProvider; public abstract class BaseTestProvider { - protected virtual TimeSpan AspireStartupTimeout => TimeSpan.FromSeconds(30); - protected virtual TimeSpan AppStartupTimeout => TimeSpan.FromSeconds(30); - protected virtual TimeSpan AppShutdownTimeout => TimeSpan.FromSeconds(10); - protected virtual TimeSpan PerfTestTimeout => TimeSpan.FromMinutes(1); - - protected abstract Task<(DistributedApplication App, string ConnectionString)> StartDistributedApplicationAsync(CancellationToken ct); - protected abstract void RegisterServices(IServiceCollection services, string connectionString); - protected virtual Task AfterHostBuildAsync(IHost host, string connectionString, CancellationToken ct) => Task.CompletedTask; + private static readonly TimeSpan AspireStartupTimeout = TimeSpan.FromSeconds(30); + private static readonly TimeSpan AppStartupTimeout = TimeSpan.FromSeconds(30); + private static readonly TimeSpan AppShutdownTimeout = TimeSpan.FromSeconds(10); + private static readonly TimeSpan PerfTestTimeout = TimeSpan.FromMinutes(1); public async Task RunAsync(string[] args) { @@ -34,26 +28,30 @@ public async Task RunAsync(string[] args) var host = builder.Build(); var lifetime = host.Services.GetRequiredService(); - await AfterHostBuildAsync(host, connectionString, startupCts.Token); + await AfterHostBuildAsync(host, startupCts.Token); Console.WriteLine("Starting app..."); using var appCts = new CancellationTokenSource(); - var appTask = Task.Run(async () => - { - try - { - await host.RunAsync(appCts.Token); - } - catch (OperationCanceledException) when (appCts.IsCancellationRequested) + var ct = appCts.Token; + var appTask = Task.Run( + async () => { - } - }); + try + { + await host.RunAsync(ct); + } + catch (OperationCanceledException) when (ct.IsCancellationRequested) + { + } + }, + ct); try { using (var cts = new CancellationTokenSource(AppStartupTimeout)) { - using var linked = CancellationTokenSource.CreateLinkedTokenSource(cts.Token, lifetime.ApplicationStarted); + using var linked = + CancellationTokenSource.CreateLinkedTokenSource(cts.Token, lifetime.ApplicationStarted); try { await Task.Delay(AppStartupTimeout, linked.Token); @@ -66,7 +64,8 @@ public async Task RunAsync(string[] args) using (var cts = new CancellationTokenSource(PerfTestTimeout)) { - using var linked = CancellationTokenSource.CreateLinkedTokenSource(cts.Token, lifetime.ApplicationStopping); + using var linked = + CancellationTokenSource.CreateLinkedTokenSource(cts.Token, lifetime.ApplicationStopping); using var scope = host.Services.CreateScope(); var perfTest = scope.ServiceProvider.GetRequiredService(); await perfTest.Run(linked.Token); @@ -94,4 +93,11 @@ public async Task RunAsync(string[] args) await app.DisposeAsync(); } } + + protected abstract Task<(DistributedApplication App, string ConnectionString)> StartDistributedApplicationAsync( + CancellationToken ct); + + protected abstract void RegisterServices(IServiceCollection services, string connectionString); + + protected virtual Task AfterHostBuildAsync(IHost host, CancellationToken ct) => Task.CompletedTask; } diff --git a/util/PerfTest/TestProvider/NatsTestProvider.cs b/util/PerfTest/TestProvider/NatsTestProvider.cs index 57fd55f..19718b0 100644 --- a/util/PerfTest/TestProvider/NatsTestProvider.cs +++ b/util/PerfTest/TestProvider/NatsTestProvider.cs @@ -38,7 +38,7 @@ protected override void RegisterServices(IServiceCollection services, string con services.AddNatsDistributedCache(options => options.BucketName = "cache"); } - protected override async Task AfterHostBuildAsync(IHost host, string connectionString, CancellationToken ct) + protected override async Task AfterHostBuildAsync(IHost host, CancellationToken ct) { Console.WriteLine("Creating KV store..."); var nats = host.Services.GetRequiredService(); diff --git a/util/PerfTest/TestProvider/RedisTestProvider.cs b/util/PerfTest/TestProvider/RedisTestProvider.cs index 37746c3..99a8a58 100644 --- a/util/PerfTest/TestProvider/RedisTestProvider.cs +++ b/util/PerfTest/TestProvider/RedisTestProvider.cs @@ -1,9 +1,11 @@ +using System.Threading; using Aspire.Hosting; using Aspire.Hosting.ApplicationModel; using Aspire.Hosting.Testing; using Microsoft.Extensions.Caching.StackExchangeRedis; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; namespace CodeCargo.Nats.DistributedCache.PerfTest.TestProvider; @@ -11,27 +13,75 @@ public class RedisTestProvider : BaseTestProvider { protected override async Task<(DistributedApplication App, string ConnectionString)> StartDistributedApplicationAsync(CancellationToken ct) { - var appHost = await DistributedApplicationTestingBuilder.CreateAsync(); - var app = await appHost.BuildAsync(); - await app.StartAsync(ct); + try + { + // Create and start the Redis app host + var appHost = await DistributedApplicationTestingBuilder.CreateAsync(); + var app = await appHost.BuildAsync(); + await app.StartAsync(ct); + + Console.WriteLine("Waiting for Redis to become available..."); + + // Give Redis container some time to start + await Task.Delay(TimeSpan.FromSeconds(3), ct); + + // Get the connection string from Aspire + // Wait for the Redis resource to become available + try + { + var resourceNotificationService = app.Services.GetRequiredService(); + await resourceNotificationService.WaitForResourceHealthyAsync("Redis", ct); + } + catch (Exception ex) + { + Console.WriteLine($"Warning: Failed to wait for Redis resource: {ex.Message}"); + + // Continue anyway and try to get the connection string + } - var resourceNotificationService = app.Services.GetRequiredService(); - await resourceNotificationService.WaitForResourceHealthyAsync("Redis", ct); + // Get the connection string from Aspire + string? connectionString; + try + { + // Try to get the connection string from Aspire + connectionString = await app.GetConnectionStringAsync("Redis", cancellationToken: ct); + if (!string.IsNullOrEmpty(connectionString)) + { + Console.WriteLine($"Using connection string from Aspire: {connectionString}"); + } + else + { + throw new InvalidOperationException("Aspire returned empty Redis connection string"); + } + } + catch (Exception ex) + { + Console.WriteLine($"Failed to get Redis connection: {ex.Message}"); + throw new InvalidOperationException("Could not establish Redis connection. Make sure the Redis container is running.", ex); + } - var connectionString = await app.GetConnectionStringAsync("Redis", cancellationToken: ct); - if (string.IsNullOrEmpty(connectionString)) + Console.WriteLine($"Connecting to Redis at: {connectionString}"); + return (app, connectionString); + } + catch (Exception ex) { - throw new InvalidOperationException("Cannot find connection string for Redis"); + Console.WriteLine($"Error starting Redis: {ex.Message}"); + Console.WriteLine(ex.StackTrace); + throw; } - - Console.WriteLine("Aspire started"); - return (app, connectionString); } protected override void RegisterServices(IServiceCollection services, string connectionString) { - services.AddStackExchangeRedisCache(options => options.Configuration = connectionString); + Console.WriteLine($"Configuring Redis with connection string: {connectionString}"); + services.AddStackExchangeRedisCache(options => + { + options.Configuration = connectionString; + + // Add some connection resilience + options.InstanceName = "PerfTest_"; + }); } - protected override Task AfterHostBuildAsync(IHost host, string connectionString, CancellationToken ct) => Task.CompletedTask; + protected override Task AfterHostBuildAsync(IHost host, CancellationToken ct) => Task.CompletedTask; } diff --git a/util/RedisAppHost/Program.cs b/util/RedisAppHost/Program.cs index 4c062a9..ddb7afa 100644 --- a/util/RedisAppHost/Program.cs +++ b/util/RedisAppHost/Program.cs @@ -1,9 +1,9 @@ var builder = DistributedApplication.CreateBuilder(args); // Redis container configuration -builder.AddRedis("Redis") +// Let Aspire dynamically assign port to avoid conflicts +var redis = builder.AddRedis("Redis") .WithImage("redis") - .WithImageTag("8.0.1") - .WithEndpoint(port: 16379, targetPort: 6379, name: "redis", scheme: "tcp"); + .WithImageTag("8.0.1"); builder.Build().Run(); From 64f4568b3f20c6a3c58283be8a92e0e927bcad9e Mon Sep 17 00:00:00 2001 From: Caleb Lloyd Date: Mon, 19 May 2025 14:58:19 -0400 Subject: [PATCH 4/5] update logging Signed-off-by: Caleb Lloyd --- util/PerfTest/PerfTest.cs | 12 +++++++++-- util/PerfTest/Program.cs | 2 +- util/PerfTest/README.md | 2 +- .../PerfTest/TestProvider/BaseTestProvider.cs | 15 ++++++------- .../PerfTest/TestProvider/NatsTestProvider.cs | 18 +++++++--------- .../TestProvider/RedisTestProvider.cs | 21 +++++++------------ 6 files changed, 36 insertions(+), 34 deletions(-) diff --git a/util/PerfTest/PerfTest.cs b/util/PerfTest/PerfTest.cs index f2ffaec..1b3f9f1 100644 --- a/util/PerfTest/PerfTest.cs +++ b/util/PerfTest/PerfTest.cs @@ -14,7 +14,8 @@ public class PerfTest private readonly IDistributedCache _cache; private readonly string[] _keys; private readonly byte[] _valuePayload; - private readonly List _stages = new(); + private readonly List _stages = []; + private string _backendName = string.Empty; public PerfTest(IDistributedCache cache) { @@ -32,10 +33,11 @@ public PerfTest(IDistributedCache cache) Array.Fill(_valuePayload, (byte)'0'); // Fill with ASCII character '0' (value 48) } - public async Task Run(CancellationToken ct) + public async Task Run(string backendName, CancellationToken ct) { // Clear stages for a new run _stages.Clear(); + _backendName = backendName; // Run all stages sequentially await RunStage("Insert", SetWithAbsoluteExpiry, ct); @@ -202,6 +204,12 @@ private void PrintResults(bool clearScreen = false) const int totalWidth = stageWidth + 1 + opsWidth + 1 + dataWidth + 1 + durationWidth + 1 + p50Width + 1 + p95Width + 1 + p99Width; + // Print backend information + if (!string.IsNullOrEmpty(_backendName)) + { + Console.WriteLine($"Backend: {_backendName}"); + } + // Print header Console.WriteLine( "{0,-" + stageWidth + "} {1," + opsWidth + "} {2," + dataWidth + "} {3," + durationWidth + "} {4," + diff --git a/util/PerfTest/Program.cs b/util/PerfTest/Program.cs index 80548a0..df83d11 100644 --- a/util/PerfTest/Program.cs +++ b/util/PerfTest/Program.cs @@ -18,4 +18,4 @@ provider = new NatsTestProvider(); } -await provider.RunAsync(args); +await provider.Run(args); diff --git a/util/PerfTest/README.md b/util/PerfTest/README.md index a539b8d..9c9b501 100644 --- a/util/PerfTest/README.md +++ b/util/PerfTest/README.md @@ -30,7 +30,7 @@ To run Redis tests instead, you can: ```bash # flag -dotnet run -c Release --redis +dotnet run -c Release -- --redis # or env var TEST_REDIS=true dotnet run -c Release diff --git a/util/PerfTest/TestProvider/BaseTestProvider.cs b/util/PerfTest/TestProvider/BaseTestProvider.cs index 79b5f62..0c661c0 100644 --- a/util/PerfTest/TestProvider/BaseTestProvider.cs +++ b/util/PerfTest/TestProvider/BaseTestProvider.cs @@ -11,11 +11,13 @@ public abstract class BaseTestProvider private static readonly TimeSpan AppShutdownTimeout = TimeSpan.FromSeconds(10); private static readonly TimeSpan PerfTestTimeout = TimeSpan.FromMinutes(1); - public async Task RunAsync(string[] args) + protected abstract string BackendName { get; } + + public async Task Run(string[] args) { Console.WriteLine("Starting Aspire..."); using var startupCts = new CancellationTokenSource(AspireStartupTimeout); - var (app, connectionString) = await StartDistributedApplicationAsync(startupCts.Token); + var (app, connectionString) = await StartAspire(startupCts.Token); try { var builder = Host.CreateDefaultBuilder(args); @@ -28,7 +30,7 @@ public async Task RunAsync(string[] args) var host = builder.Build(); var lifetime = host.Services.GetRequiredService(); - await AfterHostBuildAsync(host, startupCts.Token); + await AfterHostBuild(host, startupCts.Token); Console.WriteLine("Starting app..."); using var appCts = new CancellationTokenSource(); @@ -68,7 +70,7 @@ public async Task RunAsync(string[] args) CancellationTokenSource.CreateLinkedTokenSource(cts.Token, lifetime.ApplicationStopping); using var scope = host.Services.CreateScope(); var perfTest = scope.ServiceProvider.GetRequiredService(); - await perfTest.Run(linked.Token); + await perfTest.Run(BackendName, linked.Token); } } catch (OperationCanceledException) when (lifetime.ApplicationStopping.IsCancellationRequested) @@ -94,10 +96,9 @@ public async Task RunAsync(string[] args) } } - protected abstract Task<(DistributedApplication App, string ConnectionString)> StartDistributedApplicationAsync( - CancellationToken ct); + protected abstract Task<(DistributedApplication App, string ConnectionString)> StartAspire(CancellationToken ct); protected abstract void RegisterServices(IServiceCollection services, string connectionString); - protected virtual Task AfterHostBuildAsync(IHost host, CancellationToken ct) => Task.CompletedTask; + protected virtual Task AfterHostBuild(IHost host, CancellationToken ct) => Task.CompletedTask; } diff --git a/util/PerfTest/TestProvider/NatsTestProvider.cs b/util/PerfTest/TestProvider/NatsTestProvider.cs index 19718b0..e6027d3 100644 --- a/util/PerfTest/TestProvider/NatsTestProvider.cs +++ b/util/PerfTest/TestProvider/NatsTestProvider.cs @@ -13,15 +13,17 @@ namespace CodeCargo.Nats.DistributedCache.PerfTest.TestProvider; public class NatsTestProvider : BaseTestProvider { - protected override async Task<(DistributedApplication App, string ConnectionString)> StartDistributedApplicationAsync(CancellationToken ct) + protected override string BackendName => "NATS"; + + protected override async Task<(DistributedApplication App, string ConnectionString)> StartAspire( + CancellationToken ct) { - var appHost = await DistributedApplicationTestingBuilder.CreateAsync(); - var app = await appHost.BuildAsync(); + var appHost = await DistributedApplicationTestingBuilder.CreateAsync(ct); + var app = await appHost.BuildAsync(ct); await app.StartAsync(ct); var resourceNotificationService = app.Services.GetRequiredService(); await resourceNotificationService.WaitForResourceHealthyAsync("Nats", ct); - var connectionString = await app.GetConnectionStringAsync("Nats", cancellationToken: ct); if (string.IsNullOrEmpty(connectionString)) { @@ -38,17 +40,13 @@ protected override void RegisterServices(IServiceCollection services, string con services.AddNatsDistributedCache(options => options.BucketName = "cache"); } - protected override async Task AfterHostBuildAsync(IHost host, CancellationToken ct) + protected override async Task AfterHostBuild(IHost host, CancellationToken ct) { Console.WriteLine("Creating KV store..."); var nats = host.Services.GetRequiredService(); var kv = nats.CreateKeyValueStoreContext(); await kv.CreateOrUpdateStoreAsync( - new NatsKVConfig("cache") - { - LimitMarkerTTL = TimeSpan.FromSeconds(1), - Storage = NatsKVStorageType.Memory - }, + new NatsKVConfig("cache") { LimitMarkerTTL = TimeSpan.FromSeconds(1), Storage = NatsKVStorageType.Memory }, ct); await nats .CreateJetStreamContext() diff --git a/util/PerfTest/TestProvider/RedisTestProvider.cs b/util/PerfTest/TestProvider/RedisTestProvider.cs index 99a8a58..f779a19 100644 --- a/util/PerfTest/TestProvider/RedisTestProvider.cs +++ b/util/PerfTest/TestProvider/RedisTestProvider.cs @@ -11,7 +11,10 @@ namespace CodeCargo.Nats.DistributedCache.PerfTest.TestProvider; public class RedisTestProvider : BaseTestProvider { - protected override async Task<(DistributedApplication App, string ConnectionString)> StartDistributedApplicationAsync(CancellationToken ct) + protected override string BackendName => "Redis"; + + protected override async Task<(DistributedApplication App, string ConnectionString)> StartAspire( + CancellationToken ct) { try { @@ -22,9 +25,6 @@ public class RedisTestProvider : BaseTestProvider Console.WriteLine("Waiting for Redis to become available..."); - // Give Redis container some time to start - await Task.Delay(TimeSpan.FromSeconds(3), ct); - // Get the connection string from Aspire // Wait for the Redis resource to become available try @@ -57,7 +57,8 @@ public class RedisTestProvider : BaseTestProvider catch (Exception ex) { Console.WriteLine($"Failed to get Redis connection: {ex.Message}"); - throw new InvalidOperationException("Could not establish Redis connection. Make sure the Redis container is running.", ex); + throw new InvalidOperationException( + "Could not establish Redis connection. Make sure the Redis container is running.", ex); } Console.WriteLine($"Connecting to Redis at: {connectionString}"); @@ -71,17 +72,11 @@ public class RedisTestProvider : BaseTestProvider } } - protected override void RegisterServices(IServiceCollection services, string connectionString) - { - Console.WriteLine($"Configuring Redis with connection string: {connectionString}"); + protected override void RegisterServices(IServiceCollection services, string connectionString) => services.AddStackExchangeRedisCache(options => { options.Configuration = connectionString; - - // Add some connection resilience - options.InstanceName = "PerfTest_"; }); - } - protected override Task AfterHostBuildAsync(IHost host, CancellationToken ct) => Task.CompletedTask; + protected override Task AfterHostBuild(IHost host, CancellationToken ct) => Task.CompletedTask; } From 8477b16bb41f14fb1a85288fd88daef7b8ed7b4c Mon Sep 17 00:00:00 2001 From: Caleb Lloyd Date: Mon, 19 May 2025 16:32:25 -0400 Subject: [PATCH 5/5] cleanup Signed-off-by: Caleb Lloyd --- NatsDistributedCache.sln | 2 +- README.md | 2 +- .../PerfTest/TestProvider/BaseTestProvider.cs | 2 + .../PerfTest/TestProvider/NatsTestProvider.cs | 1 - .../TestProvider/RedisTestProvider.cs | 72 ++++--------------- 5 files changed, 16 insertions(+), 63 deletions(-) diff --git a/NatsDistributedCache.sln b/NatsDistributedCache.sln index 962cef9..53a371a 100644 --- a/NatsDistributedCache.sln +++ b/NatsDistributedCache.sln @@ -1,4 +1,4 @@ - + Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.0.31903.59 diff --git a/README.md b/README.md index 874799a..9686641 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ The `CodeCargo.Nats.HybridCacheExtensions` package provides an extension method 1. Adds the NATS `IDistributedCache` 2. Adds `HybridCache` -3. Configures `HybridCache` to use the NATs Connection's serializer registry +3. Configures `HybridCache` to use the NATS Connection's serializer registry ### Install diff --git a/util/PerfTest/TestProvider/BaseTestProvider.cs b/util/PerfTest/TestProvider/BaseTestProvider.cs index 0c661c0..689adc6 100644 --- a/util/PerfTest/TestProvider/BaseTestProvider.cs +++ b/util/PerfTest/TestProvider/BaseTestProvider.cs @@ -18,6 +18,8 @@ public async Task Run(string[] args) Console.WriteLine("Starting Aspire..."); using var startupCts = new CancellationTokenSource(AspireStartupTimeout); var (app, connectionString) = await StartAspire(startupCts.Token); + Console.WriteLine("Aspire started"); + try { var builder = Host.CreateDefaultBuilder(args); diff --git a/util/PerfTest/TestProvider/NatsTestProvider.cs b/util/PerfTest/TestProvider/NatsTestProvider.cs index e6027d3..1d1413c 100644 --- a/util/PerfTest/TestProvider/NatsTestProvider.cs +++ b/util/PerfTest/TestProvider/NatsTestProvider.cs @@ -30,7 +30,6 @@ public class NatsTestProvider : BaseTestProvider throw new InvalidOperationException("Cannot find connection string for NATS"); } - Console.WriteLine("Aspire started"); return (app, connectionString); } diff --git a/util/PerfTest/TestProvider/RedisTestProvider.cs b/util/PerfTest/TestProvider/RedisTestProvider.cs index f779a19..535637f 100644 --- a/util/PerfTest/TestProvider/RedisTestProvider.cs +++ b/util/PerfTest/TestProvider/RedisTestProvider.cs @@ -1,11 +1,8 @@ -using System.Threading; using Aspire.Hosting; using Aspire.Hosting.ApplicationModel; using Aspire.Hosting.Testing; -using Microsoft.Extensions.Caching.StackExchangeRedis; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; +using Projects; namespace CodeCargo.Nats.DistributedCache.PerfTest.TestProvider; @@ -16,67 +13,22 @@ public class RedisTestProvider : BaseTestProvider protected override async Task<(DistributedApplication App, string ConnectionString)> StartAspire( CancellationToken ct) { - try - { - // Create and start the Redis app host - var appHost = await DistributedApplicationTestingBuilder.CreateAsync(); - var app = await appHost.BuildAsync(); - await app.StartAsync(ct); - - Console.WriteLine("Waiting for Redis to become available..."); - - // Get the connection string from Aspire - // Wait for the Redis resource to become available - try - { - var resourceNotificationService = app.Services.GetRequiredService(); - await resourceNotificationService.WaitForResourceHealthyAsync("Redis", ct); - } - catch (Exception ex) - { - Console.WriteLine($"Warning: Failed to wait for Redis resource: {ex.Message}"); - - // Continue anyway and try to get the connection string - } + var appHost = await DistributedApplicationTestingBuilder.CreateAsync(ct); + var app = await appHost.BuildAsync(ct); + await app.StartAsync(ct); - // Get the connection string from Aspire - string? connectionString; - try - { - // Try to get the connection string from Aspire - connectionString = await app.GetConnectionStringAsync("Redis", cancellationToken: ct); - if (!string.IsNullOrEmpty(connectionString)) - { - Console.WriteLine($"Using connection string from Aspire: {connectionString}"); - } - else - { - throw new InvalidOperationException("Aspire returned empty Redis connection string"); - } - } - catch (Exception ex) - { - Console.WriteLine($"Failed to get Redis connection: {ex.Message}"); - throw new InvalidOperationException( - "Could not establish Redis connection. Make sure the Redis container is running.", ex); - } + var resourceNotificationService = app.Services.GetRequiredService(); + await resourceNotificationService.WaitForResourceHealthyAsync("Redis", ct); - Console.WriteLine($"Connecting to Redis at: {connectionString}"); - return (app, connectionString); - } - catch (Exception ex) + var connectionString = await app.GetConnectionStringAsync("Redis", cancellationToken: ct); + if (string.IsNullOrEmpty(connectionString)) { - Console.WriteLine($"Error starting Redis: {ex.Message}"); - Console.WriteLine(ex.StackTrace); - throw; + throw new InvalidOperationException("Cannot find connection string for Redis"); } + + return (app, connectionString); } protected override void RegisterServices(IServiceCollection services, string connectionString) => - services.AddStackExchangeRedisCache(options => - { - options.Configuration = connectionString; - }); - - protected override Task AfterHostBuild(IHost host, CancellationToken ct) => Task.CompletedTask; + services.AddStackExchangeRedisCache(options => options.Configuration = connectionString); }