]> git.deb.at Git - rhonda/impostor.git/commitdiff
Remove redirector (#502)
authorjs6pak <kubastaron@hotmail.com>
Sun, 18 Dec 2022 21:44:25 +0000 (22:44 +0100)
committerGitHub <noreply@github.com>
Sun, 18 Dec 2022 21:44:25 +0000 (22:44 +0100)
25 files changed:
docs/Running-the-server.md
docs/Server-configuration.md
docs/Writing-a-plugin.md
src/Impostor.Api/Config/DisconnectMessages.cs
src/Impostor.Api/Config/ServerRedirectorConfig.cs [deleted file]
src/Impostor.Api/Config/ServerRedirectorNode.cs [deleted file]
src/Impostor.Benchmarks/packages.lock.json
src/Impostor.Server/Extensions/NodeLocatorExtensions.cs [deleted file]
src/Impostor.Server/Impostor.Server.csproj
src/Impostor.Server/Net/Manager/GameManager.cs
src/Impostor.Server/Net/MatchmakerService.cs
src/Impostor.Server/Net/Redirector/ClientRedirector.cs [deleted file]
src/Impostor.Server/Net/Redirector/INodeLocator.cs [deleted file]
src/Impostor.Server/Net/Redirector/INodeProvider.cs [deleted file]
src/Impostor.Server/Net/Redirector/NodeLocatorNoOp.cs [deleted file]
src/Impostor.Server/Net/Redirector/NodeLocatorRedis.cs [deleted file]
src/Impostor.Server/Net/Redirector/NodeLocatorUDP.cs [deleted file]
src/Impostor.Server/Net/Redirector/NodeLocatorUDPService.cs [deleted file]
src/Impostor.Server/Net/Redirector/NodeProviderConfig.cs [deleted file]
src/Impostor.Server/Program.cs
src/Impostor.Server/config-full.json
src/Impostor.Server/packages.lock.json
src/Impostor.Tests/packages.lock.json
src/Impostor.Tools.ServerReplay/Program.cs
src/Impostor.Tools.ServerReplay/packages.lock.json

index 56e54976c8595f61842674d0a533990bf593690b..4dc4a5ff2a869d716014b44f06e3c6619861318d 100644 (file)
@@ -44,63 +44,3 @@ services:
       - /path/to/local/plugins:/app/plugins         # Only needed if using plugins
       - /path/to/local/libraries:/app/libraries     # Only needed if using external libraries
 ```
-
-## Multiple servers
-
-Follow the steps from the single server on two or more servers. You should only need to set this up if you have a very large server and can no longer fit everyone on one server: if this is your first time installing Impostor, use a single server.
-
-### Master server
-
-The master server will accept client connections and redirect them to the other servers listed in the configuration. It will not host any games itself.
-
-Example configuration:
-
-```json
-{
-  "Server": {
-    "PublicIp": "127.0.0.1",
-    "PublicPort": 22023,
-    "ListenIp": "0.0.0.0",
-    "ListenPort": 22023
-  },
-  "ServerRedirector": {
-    "Enabled": true,
-    "Master": true,
-    "Locator": {
-      "Redis": "",
-      "UdpMasterEndpoint": "127.0.0.1:22024"
-    },
-    "Nodes": [
-      {
-        "Ip": "127.0.0.1",
-        "Port": 22025
-      }
-    ]
-  }
-}
-```
-
-### Node servers
-
-The node server should have `ServerRedirector` enabled too, but `Master` **must be disabled**. Nodes do not need to be aware of each other.
-
-Example configuration:
-
-```json
-{
-  "Server": {
-    "PublicIp": "127.0.0.1",
-    "PublicPort": 22025,
-    "ListenIp": "0.0.0.0",
-    "ListenPort": 22025
-  },
-  "ServerRedirector": {
-    "Enabled": true,
-    "Master": false,
-    "Locator": {
-      "Redis": "",
-      "UdpMasterEndpoint": "127.0.0.1:22024"
-    }
-  }
-}
-```
index 5acc343f25d031fddf29def909d15a5ba5bf9c43..65b29922b12003a7e7a9cd155ba84b95e9605af5 100644 (file)
@@ -40,19 +40,6 @@ The Debug configuration is used to enable the game recorder. This is mostly usef
 | **GameRecorderEnabled** | `false` | Enables the Game Recorder.                   |
 | **GameRecorderPath**    | _empty_ | Path where the recorded games will be saved. |
 
-### ServerRedirector
-
-In a multi-node setup these values need to be specified. Note that most people do not need to run a Multi-node setup.
-
-| Key                    | Default | Value                                                                                                                                             |
-| ---------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
-| **Enabled**            | `false` | Whether the server runs in multi-node setup. If this is `false`, all other options in this section do not have any effect.                        |
-| **Master**             | `false` | Whether the current server is a master. A master is responsible for redirecting clients to nodes                                                  |
-| **Locator**            |         | Fill in either `Redis` or `UdpMasterEndpoint` to choose which method to use for locating other nodes. This must be the same across all servers.   |
-| **>Redis**             |         | Format `127.0.0.1.6379`, you can also use a password like so: `127.0.0.1.6379,password=value`.                                                    |
-| **>UdpMasterEndpoint** |         | On the master, this value acts as a listen ip and port. On a node, this should be the public ip and port of the master. Format `127.0.0.1:32320`. |
-| **Nodes**              |         | An array containing public ips and ports of nodes. Only needs to be set on the master. See above for an example.                                  |
-
 ### Serilog (Logging)
 
 Impostor's log framework, Serilog, can be configured in the config file. You can change its default log level and you can add additional sinks.
@@ -105,12 +92,4 @@ IMPOSTOR_Server__ListenIp=0.0.0.0
 IMPOSTOR_Server__ListenPort=22023
 IMPOSTOR_AntiCheat__Enabled=true
 IMPOSTOR_AntiCheat__BanIpFromGame=true
-IMPOSTOR_ServerRedirector__Enabled=false
-IMPOSTOR_ServerRedirector__Master=true
-IMPOSTOR_ServerRedirector__Locator__Redis=127.0.0.1.6379
-IMPOSTOR_ServerRedirector__Locator__UdpMasterEndpoint=127.0.0.1:32320
-IMPOSTOR_ServerRedirector__Nodes__0__Ip=127.0.0.1
-IMPOSTOR_ServerRedirector__Nodes__0__Port=22024
-IMPOSTOR_ServerRedirector__Nodes__1__Ip=127.0.0.1
-IMPOSTOR_ServerRedirector__Nodes__1__Port=22025
 ```
index e931709a85e2be8401059da603add591a670bffa..4668c81636da009ba385601ee5eb573e4746e049 100644 (file)
@@ -293,7 +293,6 @@ Some extra information that might be useful for those developing plugins.
   - `IEventManager`
   - `IClientManager`
   - `IOptions<ServerConfig>`
-  - `IOptions<ServerRedirectorConfig>`
 - You can add your own classes and `EventListener` implementation to the `IServiceProvider` by creating a new class and implementing `IPluginStartup`. Make sure to register them as a singleton `services.AddSingleton<IEventListener, GameEventListener>();`.
 
 ### Server configuration
index 353b79bed729b5854c18a4e92ddbdf6e50a5ac13..5a4055983fb8a82add85f978d952ad0f1a9833c5 100644 (file)
@@ -14,9 +14,6 @@
         public const string Destroyed = "The game you tried to join is being destroyed. " +
                                         "Please create a new game.";
 
-        public const string NotImplemented = "Game listing has not been implemented in Impostor yet for servers " +
-                                             "running in server redirection mode.";
-
         public const string UsernameLength = "Your username is too long, please make it shorter.";
 
         public const string UsernameIllegalCharacters = "Your username contains illegal characters, please remove them.";
diff --git a/src/Impostor.Api/Config/ServerRedirectorConfig.cs b/src/Impostor.Api/Config/ServerRedirectorConfig.cs
deleted file mode 100644 (file)
index 0d11ab1..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-using System.Collections.Generic;
-using System.Diagnostics.CodeAnalysis;
-
-namespace Impostor.Api.Config
-{
-    public class ServerRedirectorConfig
-    {
-        public const string Section = "ServerRedirector";
-
-        public bool Enabled { get; set; }
-
-        public bool Master { get; set; }
-
-        public NodeLocator? Locator { get; set; }
-
-        public List<ServerRedirectorNode>? Nodes { get; set; }
-
-        public class NodeLocator
-        {
-            [AllowNull]
-            public string Redis { get; set; }
-
-            [AllowNull]
-            public string UdpMasterEndpoint { get; set; }
-        }
-    }
-}
diff --git a/src/Impostor.Api/Config/ServerRedirectorNode.cs b/src/Impostor.Api/Config/ServerRedirectorNode.cs
deleted file mode 100644 (file)
index 9980bd4..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-using System.Diagnostics.CodeAnalysis;
-
-namespace Impostor.Api.Config
-{
-    public class ServerRedirectorNode
-    {
-        [AllowNull]
-        public string Ip { get; set; }
-
-        [AllowNull]
-        public ushort Port { get; set; }
-    }
-}
index f5c00f7fa3a958d7213758a71a428ca0f81d2deb..2a0b8292e3c940f6188819ffb9626dcadcc2edd6 100644 (file)
         "resolved": "3.1.6",
         "contentHash": "jek4XYaQ/PGUwDKKhwR8K47Uh1189PFzMeLqO83mXrXQVIpARZCcfuDedH50YDTepBkfijCZN5U/vZi++erxtg=="
       },
-      "Microsoft.Extensions.Caching.Abstractions": {
-        "type": "Transitive",
-        "resolved": "7.0.0",
-        "contentHash": "IeimUd0TNbhB4ded3AbgBLQv2SnsiVugDyGV1MvspQFVlA07nDC7Zul7kcwH5jWN3JiTcp/ySE83AIJo8yfKjg==",
-        "dependencies": {
-          "Microsoft.Extensions.Primitives": "7.0.0"
-        }
-      },
-      "Microsoft.Extensions.Caching.StackExchangeRedis": {
-        "type": "Transitive",
-        "resolved": "7.0.1",
-        "contentHash": "YtwtXPy5sBBkfj7kZkDEHwiMxgUZC0Coqq0x9ViL2zvj2nHBesNvJz/gFCLsFzEvw8UFfzHT1KGKG/QGI2cLVg==",
-        "dependencies": {
-          "Microsoft.Extensions.Caching.Abstractions": "7.0.0",
-          "Microsoft.Extensions.Logging.Abstractions": "7.0.0",
-          "Microsoft.Extensions.Options": "7.0.0",
-          "StackExchange.Redis": "2.2.4"
-        }
-      },
       "Microsoft.Extensions.Configuration": {
         "type": "Transitive",
         "resolved": "7.0.0",
       },
       "Microsoft.NETCore.Platforms": {
         "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ=="
-      },
-      "Microsoft.Win32.Registry": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==",
-        "dependencies": {
-          "System.Security.AccessControl": "5.0.0",
-          "System.Security.Principal.Windows": "5.0.0"
-        }
-      },
-      "Microsoft.Win32.SystemEvents": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "Bh6blKG8VAKvXiLe2L+sEsn62nc1Ij34MrNxepD2OCrS5cpCwQa9MeLyhVQPQ/R4Wlzwuy6wMK8hLb11QPDRsQ==",
-        "dependencies": {
-          "Microsoft.NETCore.Platforms": "5.0.0"
-        }
+        "resolved": "2.0.0",
+        "contentHash": "VdLJOCXhZaEMY7Hm2GKiULmn7IEPFE4XC5LPSfBVCUIA8YLZVh846gtfBJalsPQF2PlzdD7ecX7DZEulJ402ZQ=="
       },
       "Perfolizer": {
         "type": "Transitive",
           "System.Memory": "4.5.3"
         }
       },
-      "Pipelines.Sockets.Unofficial": {
-        "type": "Transitive",
-        "resolved": "2.2.0",
-        "contentHash": "7hzHplEIVOGBl5zOQZGX/DiJDHjq+RVRVrYgDiqXb6RriqWAdacXxp+XO9WSrATCEXyNOUOQg9aqQArsjase/A==",
-        "dependencies": {
-          "System.IO.Pipelines": "5.0.0"
-        }
-      },
       "Serilog": {
         "type": "Transitive",
         "resolved": "2.12.0",
           "Serilog": "2.10.0"
         }
       },
-      "StackExchange.Redis": {
-        "type": "Transitive",
-        "resolved": "2.2.4",
-        "contentHash": "wM0OuRyRaZTFndFRjIOvas4jjkeclRJsmNm0eAx5tOju3SQisrLubNaSFT/dBypi4Vh1n7nYc1gWpw9L7ernOg==",
-        "dependencies": {
-          "Pipelines.Sockets.Unofficial": "2.2.0",
-          "System.Diagnostics.PerformanceCounter": "5.0.0"
-        }
-      },
       "System.CodeDom": {
         "type": "Transitive",
         "resolved": "6.0.0",
         "resolved": "5.0.0",
         "contentHash": "FXkLXiK0sVVewcso0imKQoOxjoPAj42R8HtjjbSjVPAzwDfzoyoznWxgA3c38LDbN9SJux1xXoXYAhz98j7r2g=="
       },
-      "System.Configuration.ConfigurationManager": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "aM7cbfEfVNlEEOj3DsZP+2g9NRwbkyiAv2isQEzw7pnkDg9ekCU2m1cdJLM02Uq691OaCS91tooaxcEn8d0q5w==",
-        "dependencies": {
-          "System.Security.Cryptography.ProtectedData": "5.0.0",
-          "System.Security.Permissions": "5.0.0"
-        }
-      },
       "System.Diagnostics.EventLog": {
         "type": "Transitive",
         "resolved": "7.0.0",
         "contentHash": "eUDP47obqQm3SFJfP6z+Fx2nJ4KKTQbXB4Q9Uesnzw9SbYdhjyoGXuvDn/gEmFY6N5Z3bFFbpAQGA7m6hrYJCw=="
       },
-      "System.Diagnostics.PerformanceCounter": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "kcQWWtGVC3MWMNXdMDWfrmIlFZZ2OdoeT6pSNVRtk9+Sa7jwdPiMlNwb0ZQcS7NRlT92pCfmjRtkSWUW3RAKwg==",
-        "dependencies": {
-          "Microsoft.NETCore.Platforms": "5.0.0",
-          "Microsoft.Win32.Registry": "5.0.0",
-          "System.Configuration.ConfigurationManager": "5.0.0",
-          "System.Security.Principal.Windows": "5.0.0"
-        }
-      },
-      "System.Drawing.Common": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "SztFwAnpfKC8+sEKXAFxCBWhKQaEd97EiOL7oZJZP56zbqnLpmxACWA8aGseaUExciuEAUuR9dY8f7HkTRAdnw==",
-        "dependencies": {
-          "Microsoft.Win32.SystemEvents": "5.0.0"
-        }
-      },
-      "System.IO.Pipelines": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "irMYm3vhVgRsYvHTU5b2gsT2CwT/SMM6LZFzuJjpIvT5Z4CshxNsaoBC1X/LltwuR3Opp8d6jOS/60WwOb7Q2Q=="
-      },
       "System.Management": {
         "type": "Transitive",
         "resolved": "6.0.0",
         "resolved": "5.0.0",
         "contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA=="
       },
-      "System.Security.AccessControl": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==",
-        "dependencies": {
-          "Microsoft.NETCore.Platforms": "5.0.0",
-          "System.Security.Principal.Windows": "5.0.0"
-        }
-      },
-      "System.Security.Cryptography.ProtectedData": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "HGxMSAFAPLNoxBvSfW08vHde0F9uh7BjASwu6JF9JnXuEPhCY3YUqURn0+bQV/4UWeaqymmrHWV+Aw9riQCtCA=="
-      },
-      "System.Security.Permissions": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "uE8juAhEkp7KDBCdjDIE3H9R1HJuEHqeqX8nLX9gmYKWwsqk3T5qZlPx8qle5DPKimC/Fy3AFTdV7HamgCh9qQ==",
-        "dependencies": {
-          "System.Security.AccessControl": "5.0.0",
-          "System.Windows.Extensions": "5.0.0"
-        }
-      },
-      "System.Security.Principal.Windows": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA=="
-      },
       "System.Text.Encoding.CodePages": {
         "type": "Transitive",
         "resolved": "4.5.0",
         "resolved": "4.5.4",
         "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg=="
       },
-      "System.Windows.Extensions": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "c1ho9WU9ZxMZawML+ssPKZfdnrg/OjR3pe0m9v8230z3acqphwvPJqzAkH54xRYm5ntZHGG1EPP3sux9H3qSPg==",
-        "dependencies": {
-          "System.Drawing.Common": "5.0.0"
-        }
-      },
       "impostor.api": {
         "type": "Project",
         "dependencies": {
         "dependencies": {
           "Impostor.Api": "[1.7.3-dev, )",
           "Impostor.Hazel": "[1.0.0, )",
-          "Microsoft.Extensions.Caching.StackExchangeRedis": "[7.0.1, )",
           "Microsoft.Extensions.FileSystemGlobbing": "[7.0.0, )",
           "Microsoft.Extensions.Hosting": "[7.0.0, )",
           "Microsoft.Extensions.ObjectPool": "[7.0.1, )",
diff --git a/src/Impostor.Server/Extensions/NodeLocatorExtensions.cs b/src/Impostor.Server/Extensions/NodeLocatorExtensions.cs
deleted file mode 100644 (file)
index 96ceb4d..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-using System.Threading.Tasks;
-using Impostor.Server.Net.Redirector;
-
-namespace Impostor.Server
-{
-    public static class NodeLocatorExtensions
-    {
-        public static async ValueTask<bool> ExistsAsync(this INodeLocator nodeLocator, string gameCode)
-        {
-            return await nodeLocator.FindAsync(gameCode) != null;
-        }
-    }
-}
index 2c5a87cc8360214549190f7e8a1270ae17cc1e29..6e708b0c4ee77bf81034c95aaeb823c54d6050c1 100644 (file)
@@ -24,7 +24,6 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="7.0.1" />
     <PackageReference Include="Microsoft.Extensions.FileSystemGlobbing" Version="7.0.0" />
     <PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.0" />
     <PackageReference Include="Microsoft.Extensions.ObjectPool" Version="7.0.1" />
index f4c6b1dc0b23c7332f6493e3fa8288be7cf4925a..ec87434f86b18f953f5c263cdb273d70c56ab888 100644 (file)
@@ -12,7 +12,6 @@ using Impostor.Api.Games.Managers;
 using Impostor.Api.Innersloth;
 using Impostor.Api.Net;
 using Impostor.Server.Events;
-using Impostor.Server.Net.Redirector;
 using Impostor.Server.Net.State;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Logging;
@@ -23,7 +22,6 @@ namespace Impostor.Server.Net.Manager
     internal class GameManager : IGameManager
     {
         private readonly ILogger<GameManager> _logger;
-        private readonly INodeLocator _nodeLocator;
         private readonly IPEndPoint _publicIp;
         private readonly ConcurrentDictionary<int, Game> _games;
         private readonly CompatibilityConfig _compatibilityConfig;
@@ -31,10 +29,9 @@ namespace Impostor.Server.Net.Manager
         private readonly IEventManager _eventManager;
         private readonly IGameCodeFactory _gameCodeFactory;
 
-        public GameManager(ILogger<GameManager> logger, IOptions<ServerConfig> config, INodeLocator nodeLocator, IServiceProvider serviceProvider, IEventManager eventManager, IGameCodeFactory gameCodeFactory, IOptions<CompatibilityConfig> compatibilityConfig)
+        public GameManager(ILogger<GameManager> logger, IOptions<ServerConfig> config, IServiceProvider serviceProvider, IEventManager eventManager, IGameCodeFactory gameCodeFactory, IOptions<CompatibilityConfig> compatibilityConfig)
         {
             _logger = logger;
-            _nodeLocator = nodeLocator;
             _serviceProvider = serviceProvider;
             _eventManager = eventManager;
             _gameCodeFactory = gameCodeFactory;
@@ -109,7 +106,6 @@ namespace Impostor.Server.Net.Manager
             }
 
             _logger.LogDebug("Remove game with code {0} ({1}).", GameCodeParser.IntToGameName(gameCode), gameCode);
-            await _nodeLocator.RemoveAsync(GameCodeParser.IntToGameName(gameCode));
 
             await _eventManager.CallAsync(new GameDestroyedEvent(game));
         }
@@ -124,7 +120,6 @@ namespace Impostor.Server.Net.Manager
                 return null;
             }
 
-            // TODO: Prevent duplicates when using server redirector using INodeProvider.
             var (success, game) = await TryCreateAsync(options, @event.GameCode);
 
             for (var i = 0; i < 10 && !success; i++)
@@ -148,15 +143,13 @@ namespace Impostor.Server.Net.Manager
         private async ValueTask<(bool Success, Game? Game)> TryCreateAsync(GameOptionsData options, GameCode? desiredGameCode = null)
         {
             var gameCode = desiredGameCode ?? _gameCodeFactory.Create();
-            var gameCodeStr = gameCode.Code;
             var game = ActivatorUtilities.CreateInstance<Game>(_serviceProvider, _publicIp, gameCode, options);
 
-            if (await _nodeLocator.ExistsAsync(gameCodeStr) || !_games.TryAdd(gameCode, game))
+            if (!_games.TryAdd(gameCode, game))
             {
                 return (false, null);
             }
 
-            await _nodeLocator.SaveAsync(gameCodeStr, _publicIp);
             _logger.LogDebug("Created game with code {0}.", game.Code);
 
             await _eventManager.CallAsync(new GameCreatedEvent(game));
index 35ff6dff374b09103ae385e4d67eb54c2c637ef4..6973ba3295afb7203db7b6f5baccac9964e4ece8 100644 (file)
@@ -12,18 +12,15 @@ namespace Impostor.Server.Net
     {
         private readonly ILogger<MatchmakerService> _logger;
         private readonly ServerConfig _serverConfig;
-        private readonly ServerRedirectorConfig _redirectorConfig;
         private readonly Matchmaker _matchmaker;
 
         public MatchmakerService(
             ILogger<MatchmakerService> logger,
             IOptions<ServerConfig> serverConfig,
-            IOptions<ServerRedirectorConfig> redirectorConfig,
             Matchmaker matchmaker)
         {
             _logger = logger;
             _serverConfig = serverConfig.Value;
-            _redirectorConfig = redirectorConfig.Value;
             _matchmaker = matchmaker;
         }
 
@@ -39,13 +36,6 @@ namespace Impostor.Server.Net
                 endpoint.Port,
                 _serverConfig.ResolvePublicIp(),
                 _serverConfig.PublicPort);
-
-            if (_redirectorConfig.Enabled)
-            {
-                _logger.LogWarning(_redirectorConfig.Master
-                    ? "Server redirection is enabled as master, this instance will redirect clients to other nodes."
-                    : "Server redirection is enabled as node, this instance will accept clients.");
-            }
         }
 
         public async Task StopAsync(CancellationToken cancellationToken)
diff --git a/src/Impostor.Server/Net/Redirector/ClientRedirector.cs b/src/Impostor.Server/Net/Redirector/ClientRedirector.cs
deleted file mode 100644 (file)
index 67ad048..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-using System.Threading.Tasks;
-using Impostor.Api.Config;
-using Impostor.Api.Innersloth;
-using Impostor.Api.Net.Messages;
-using Impostor.Api.Net.Messages.C2S;
-using Impostor.Api.Net.Messages.S2C;
-using Impostor.Hazel;
-using Impostor.Server.Net.Hazel;
-using Impostor.Server.Net.Manager;
-using Serilog;
-
-namespace Impostor.Server.Net.Redirector
-{
-    internal class ClientRedirector : ClientBase
-    {
-        private static readonly ILogger Logger = Log.ForContext<ClientRedirector>();
-
-        private readonly ClientManager _clientManager;
-        private readonly INodeProvider _nodeProvider;
-        private readonly INodeLocator _nodeLocator;
-
-        public ClientRedirector(
-            string name,
-            int gameVersion,
-            Language language,
-            QuickChatModes chatMode,
-            PlatformSpecificData platformSpecificData,
-            HazelConnection connection,
-            ClientManager clientManager,
-            INodeProvider nodeProvider,
-            INodeLocator nodeLocator)
-            : base(name, gameVersion, language, chatMode, platformSpecificData, connection)
-        {
-            _clientManager = clientManager;
-            _nodeProvider = nodeProvider;
-            _nodeLocator = nodeLocator;
-        }
-
-        public override async ValueTask HandleMessageAsync(IMessageReader reader, MessageType messageType)
-        {
-            var flag = reader.Tag;
-
-            Logger.Verbose("Server got {0}.", flag);
-
-            switch (flag)
-            {
-                case MessageFlags.HostGame:
-                {
-                    using var packet = MessageWriter.Get(MessageType.Reliable);
-                    Message13RedirectS2C.Serialize(packet, false, _nodeProvider.Get());
-                    await Connection.SendAsync(packet);
-                    break;
-                }
-
-                case MessageFlags.JoinGame:
-                {
-                    Message01JoinGameC2S.Deserialize(reader, out var gameCode);
-
-                    var endpoint = await _nodeLocator.FindAsync(gameCode);
-                    if (endpoint == null)
-                    {
-                        await DisconnectAsync(DisconnectReason.GameMissing);
-                    }
-                    else
-                    {
-                        using var packet = MessageWriter.Get(MessageType.Reliable);
-                        Message13RedirectS2C.Serialize(packet, false, endpoint);
-                        await Connection.SendAsync(packet);
-                    }
-
-                    break;
-                }
-
-                case MessageFlags.GetGameListV2:
-                {
-                    // TODO: Implement.
-                    await DisconnectAsync(DisconnectReason.Custom, DisconnectMessages.NotImplemented);
-                    break;
-                }
-
-                default:
-                {
-                    Logger.Warning("Received unsupported message flag on the redirector ({0}).", flag);
-                    break;
-                }
-            }
-        }
-
-        public override ValueTask HandleDisconnectAsync(string reason)
-        {
-            _clientManager.Remove(this);
-            return default;
-        }
-    }
-}
diff --git a/src/Impostor.Server/Net/Redirector/INodeLocator.cs b/src/Impostor.Server/Net/Redirector/INodeLocator.cs
deleted file mode 100644 (file)
index 1c3391a..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-using System.Net;
-using System.Threading.Tasks;
-
-namespace Impostor.Server.Net.Redirector
-{
-    public interface INodeLocator
-    {
-        ValueTask<IPEndPoint?> FindAsync(string gameCode);
-
-        ValueTask SaveAsync(string gameCode, IPEndPoint endPoint);
-
-        ValueTask RemoveAsync(string gameCode);
-    }
-}
diff --git a/src/Impostor.Server/Net/Redirector/INodeProvider.cs b/src/Impostor.Server/Net/Redirector/INodeProvider.cs
deleted file mode 100644 (file)
index fb7240c..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-using System.Net;
-
-namespace Impostor.Server.Net.Redirector
-{
-    internal interface INodeProvider
-    {
-        IPEndPoint Get();
-    }
-}
diff --git a/src/Impostor.Server/Net/Redirector/NodeLocatorNoOp.cs b/src/Impostor.Server/Net/Redirector/NodeLocatorNoOp.cs
deleted file mode 100644 (file)
index baef6db..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-using System.Net;
-using System.Threading.Tasks;
-
-namespace Impostor.Server.Net.Redirector
-{
-    public class NodeLocatorNoOp : INodeLocator
-    {
-        public ValueTask<IPEndPoint?> FindAsync(string gameCode) => ValueTask.FromResult(default(IPEndPoint));
-
-        public ValueTask SaveAsync(string gameCode, IPEndPoint endPoint) => ValueTask.CompletedTask;
-
-        public ValueTask RemoveAsync(string gameCode) => ValueTask.CompletedTask;
-    }
-}
diff --git a/src/Impostor.Server/Net/Redirector/NodeLocatorRedis.cs b/src/Impostor.Server/Net/Redirector/NodeLocatorRedis.cs
deleted file mode 100644 (file)
index f4595e3..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-using System;
-using System.Net;
-using System.Threading.Tasks;
-using Microsoft.Extensions.Caching.Distributed;
-using Microsoft.Extensions.Logging;
-
-namespace Impostor.Server.Net.Redirector
-{
-    public class NodeLocatorRedis : INodeLocator
-    {
-        private readonly IDistributedCache _cache;
-
-        public NodeLocatorRedis(ILogger<NodeLocatorRedis> logger, IDistributedCache cache)
-        {
-            logger.LogWarning("Using the redis NodeLocator.");
-            _cache = cache;
-        }
-
-        public async ValueTask<IPEndPoint?> FindAsync(string gameCode)
-        {
-            var entry = await _cache.GetStringAsync(gameCode);
-            if (entry == null)
-            {
-                return null;
-            }
-
-            return IPEndPoint.Parse(entry);
-        }
-
-        public async ValueTask SaveAsync(string gameCode, IPEndPoint endPoint)
-        {
-            await _cache.SetStringAsync(gameCode, endPoint.ToString(), new DistributedCacheEntryOptions
-            {
-                SlidingExpiration = TimeSpan.FromHours(1),
-            });
-        }
-
-        public async ValueTask RemoveAsync(string gameCode)
-        {
-            await _cache.RemoveAsync(gameCode);
-        }
-    }
-}
diff --git a/src/Impostor.Server/Net/Redirector/NodeLocatorUDP.cs b/src/Impostor.Server/Net/Redirector/NodeLocatorUDP.cs
deleted file mode 100644 (file)
index 4b640a9..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-using System;
-using System.Collections.Concurrent;
-using System.Net;
-using System.Net.Sockets;
-using System.Text;
-using System.Threading.Tasks;
-using Impostor.Api.Config;
-using Microsoft.Extensions.Logging;
-using Microsoft.Extensions.Options;
-
-namespace Impostor.Server.Net.Redirector
-{
-    public class NodeLocatorUdp : INodeLocator, IDisposable
-    {
-        private readonly ILogger<NodeLocatorUdp> _logger;
-        private readonly bool _isMaster;
-        private readonly IPEndPoint? _server;
-        private readonly UdpClient? _client;
-        private readonly ConcurrentDictionary<string, AvailableNode>? _availableNodes;
-
-        public NodeLocatorUdp(ILogger<NodeLocatorUdp> logger, IOptions<ServerRedirectorConfig> config)
-        {
-            _logger = logger;
-
-            if (config.Value.Master)
-            {
-                _isMaster = true;
-                _availableNodes = new ConcurrentDictionary<string, AvailableNode>();
-            }
-            else
-            {
-                _isMaster = false;
-
-                if (!IPEndPoint.TryParse(config.Value.Locator!.UdpMasterEndpoint, out var endpoint))
-                {
-                    throw new ArgumentException("UdpMasterEndpoint should be in the ip:port format.");
-                }
-
-                _logger.LogWarning("Node server will send updates to {0}.", endpoint);
-                _server = endpoint;
-                _client = new UdpClient();
-
-                try
-                {
-                    _client.DontFragment = true;
-                }
-                catch (SocketException)
-                {
-                }
-            }
-        }
-
-        public void Update(IPEndPoint ip, string gameCode)
-        {
-            _logger.LogDebug("Received update {0} -> {1}", gameCode, ip);
-
-            _availableNodes!.AddOrUpdate(
-                gameCode,
-                s => new AvailableNode(ip, DateTimeOffset.UtcNow),
-                (s, node) =>
-                {
-                    node.Endpoint = ip;
-                    node.LastUpdated = DateTimeOffset.UtcNow;
-
-                    return node;
-                });
-
-            foreach (var (key, value) in _availableNodes)
-            {
-                if (value.Expired)
-                {
-                    _availableNodes.TryRemove(key, out _);
-                }
-            }
-        }
-
-        public ValueTask<IPEndPoint?> FindAsync(string gameCode)
-        {
-            if (!_isMaster)
-            {
-                return ValueTask.FromResult(default(IPEndPoint));
-            }
-
-            if (_availableNodes!.TryGetValue(gameCode, out var node))
-            {
-                if (node.Expired)
-                {
-                    _availableNodes.TryRemove(gameCode, out _);
-                    return ValueTask.FromResult(default(IPEndPoint));
-                }
-
-                return ValueTask.FromResult(node.Endpoint)!;
-            }
-
-            return ValueTask.FromResult(default(IPEndPoint));
-        }
-
-        public ValueTask RemoveAsync(string gameCode)
-        {
-            if (!_isMaster)
-            {
-                return ValueTask.CompletedTask;
-            }
-
-            _availableNodes!.TryRemove(gameCode, out _);
-            return ValueTask.CompletedTask;
-        }
-
-        public ValueTask SaveAsync(string gameCode, IPEndPoint endPoint)
-        {
-            var data = Encoding.UTF8.GetBytes($"{gameCode},{endPoint}");
-            _client!.Send(data, data.Length, _server);
-            return ValueTask.CompletedTask;
-        }
-
-        public void Dispose()
-        {
-            _client?.Dispose();
-        }
-
-        private class AvailableNode
-        {
-            public AvailableNode(IPEndPoint endpoint, DateTimeOffset lastUpdated)
-            {
-                Endpoint = endpoint;
-                LastUpdated = lastUpdated;
-            }
-
-            public IPEndPoint Endpoint { get; set; }
-
-            public DateTimeOffset LastUpdated { get; set; }
-
-            public bool Expired => LastUpdated < DateTimeOffset.UtcNow.AddHours(-1);
-        }
-    }
-}
diff --git a/src/Impostor.Server/Net/Redirector/NodeLocatorUDPService.cs b/src/Impostor.Server/Net/Redirector/NodeLocatorUDPService.cs
deleted file mode 100644 (file)
index fba9ac1..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-using System;
-using System.Net;
-using System.Net.Sockets;
-using System.Text;
-using System.Threading;
-using System.Threading.Tasks;
-using Impostor.Api.Config;
-using Microsoft.Extensions.Hosting;
-using Microsoft.Extensions.Logging;
-using Microsoft.Extensions.Options;
-
-namespace Impostor.Server.Net.Redirector
-{
-    public class NodeLocatorUdpService : BackgroundService
-    {
-        private readonly NodeLocatorUdp _nodeLocator;
-        private readonly ILogger<NodeLocatorUdpService> _logger;
-        private readonly UdpClient _client;
-
-        public NodeLocatorUdpService(
-            INodeLocator nodeLocator,
-            ILogger<NodeLocatorUdpService> logger,
-            IOptions<ServerRedirectorConfig> options)
-        {
-            _nodeLocator = (NodeLocatorUdp)nodeLocator;
-            _logger = logger;
-
-            if (!IPEndPoint.TryParse(options.Value.Locator!.UdpMasterEndpoint, out var endpoint))
-            {
-                throw new ArgumentException("UdpMasterEndpoint should be in the ip:port format.");
-            }
-
-            _client = new UdpClient(endpoint);
-
-            try
-            {
-                _client.DontFragment = true;
-            }
-            catch (SocketException)
-            {
-            }
-        }
-
-        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
-        {
-            _logger.LogWarning("Master server is listening for node updates on {0}.", _client.Client.LocalEndPoint);
-
-            stoppingToken.Register(() =>
-            {
-                _client.Close();
-                _client.Dispose();
-            });
-
-            try
-            {
-                while (!stoppingToken.IsCancellationRequested)
-                {
-                    // Receive data from a node.
-                    UdpReceiveResult data;
-
-                    try
-                    {
-                        data = await _client.ReceiveAsync();
-                    }
-                    catch (ObjectDisposedException)
-                    {
-                        break;
-                    }
-
-                    // Check if data is valid.
-                    if (data.Buffer.Length == 0)
-                    {
-                        break;
-                    }
-
-                    // Parse the data.
-                    var message = Encoding.UTF8.GetString(data.Buffer);
-                    var parts = message.Split(',', 2);
-                    if (parts.Length != 2)
-                    {
-                        continue;
-                    }
-
-                    if (!IPEndPoint.TryParse(parts[1], out var ipEndPoint))
-                    {
-                        continue;
-                    }
-
-                    // Update the NodeLocator.
-                    _nodeLocator.Update(ipEndPoint, parts[0]);
-                }
-            }
-            catch (Exception e)
-            {
-                _logger.LogError(e, "Error in NodeLocatorUDPService.");
-            }
-
-            _logger.LogWarning("Master server node update listener is stopping.");
-        }
-    }
-}
diff --git a/src/Impostor.Server/Net/Redirector/NodeProviderConfig.cs b/src/Impostor.Server/Net/Redirector/NodeProviderConfig.cs
deleted file mode 100644 (file)
index 7111bd0..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-using System.Collections.Generic;
-using System.Net;
-using Impostor.Api.Config;
-using Microsoft.Extensions.Options;
-
-namespace Impostor.Server.Net.Redirector
-{
-    internal class NodeProviderConfig : INodeProvider
-    {
-        private readonly List<IPEndPoint> _nodes;
-        private readonly object _lock;
-        private int _currentIndex;
-
-        public NodeProviderConfig(IOptions<ServerRedirectorConfig> redirectorConfig)
-        {
-            _nodes = new List<IPEndPoint>();
-            _lock = new object();
-
-            if (redirectorConfig.Value.Nodes != null)
-            {
-                foreach (var node in redirectorConfig.Value.Nodes)
-                {
-                    _nodes.Add(new IPEndPoint(IPAddress.Parse(node.Ip), node.Port));
-                }
-            }
-        }
-
-        public IPEndPoint Get()
-        {
-            lock (_lock)
-            {
-                var node = _nodes[_currentIndex++];
-
-                if (_currentIndex == _nodes.Count)
-                {
-                    _currentIndex = 0;
-                }
-
-                return node;
-            }
-        }
-    }
-}
index 0ab343f43bc412a676c4c2e9ee6bbea24e647110..128ba5a1aa397d6673134b553ece6c6fd2730b7a 100644 (file)
@@ -17,7 +17,6 @@ using Impostor.Server.Net.Custom;
 using Impostor.Server.Net.Factories;
 using Impostor.Server.Net.Manager;
 using Impostor.Server.Net.Messages;
-using Impostor.Server.Net.Redirector;
 using Impostor.Server.Plugins;
 using Impostor.Server.Recorder;
 using Impostor.Server.Utils;
@@ -92,10 +91,6 @@ namespace Impostor.Server
                         .GetSection(DebugConfig.Section)
                         .Get<DebugConfig>() ?? new DebugConfig();
 
-                    var redirector = host.Configuration
-                        .GetSection(ServerRedirectorConfig.Section)
-                        .Get<ServerRedirectorConfig>() ?? new ServerRedirectorConfig();
-
                     services.AddSingleton<ServerEnvironment>();
                     services.AddSingleton<IServerEnvironment>(p => p.GetRequiredService<ServerEnvironment>());
                     services.AddSingleton<IDateTimeProvider, RealDateTimeProvider>();
@@ -104,82 +99,32 @@ namespace Impostor.Server
                     services.Configure<AntiCheatConfig>(host.Configuration.GetSection(AntiCheatConfig.Section));
                     services.Configure<CompatibilityConfig>(host.Configuration.GetSection(CompatibilityConfig.Section));
                     services.Configure<ServerConfig>(host.Configuration.GetSection(ServerConfig.Section));
-                    services.Configure<ServerRedirectorConfig>(host.Configuration.GetSection(ServerRedirectorConfig.Section));
-
-                    if (redirector.Enabled)
-                    {
-                        if (!string.IsNullOrEmpty(redirector.Locator?.Redis))
-                        {
-                            // When joining a game, it retrieves the game server ip from redis.
-                            // When a game has been created on this node, it stores the game code with its ip in redis.
-                            services.AddSingleton<INodeLocator, NodeLocatorRedis>();
-
-                            // Dependency for the NodeLocatorRedis.
-                            services.AddStackExchangeRedisCache(options =>
-                            {
-                                options.Configuration = redirector.Locator.Redis;
-                                options.InstanceName = "ImpostorRedis";
-                            });
-                        }
-                        else if (!string.IsNullOrEmpty(redirector.Locator?.UdpMasterEndpoint))
-                        {
-                            services.AddSingleton<INodeLocator, NodeLocatorUdp>();
-
-                            if (redirector.Master)
-                            {
-                                services.AddHostedService<NodeLocatorUdpService>();
-                            }
-                        }
-                        else
-                        {
-                            throw new Exception("Missing a valid NodeLocator config.");
-                        }
-
-                        // Use the configuration as source for the list of nodes to provide
-                        // when creating a game.
-                        services.AddSingleton<INodeProvider, NodeProviderConfig>();
-                    }
-                    else
-                    {
-                        // Redirector is not enabled but the dependency is still required.
-                        // So we provide one that ignores all calls.
-                        services.AddSingleton<INodeLocator, NodeLocatorNoOp>();
-                    }
 
                     services.AddSingleton<ClientManager>();
                     services.AddSingleton<IClientManager>(p => p.GetRequiredService<ClientManager>());
 
-                    if (redirector.Enabled && redirector.Master)
+                    if (debug.GameRecorderEnabled)
                     {
-                        services.AddSingleton<IClientFactory, ClientFactory<ClientRedirector>>();
-
-                        // For a master server, we don't need a GameManager.
+                        services.AddSingleton<ObjectPoolProvider>(new DefaultObjectPoolProvider());
+                        services.AddSingleton<ObjectPool<PacketSerializationContext>>(serviceProvider =>
+                        {
+                            var provider = serviceProvider.GetRequiredService<ObjectPoolProvider>();
+                            var policy = new PacketSerializationContextPooledObjectPolicy();
+                            return provider.Create(policy);
+                        });
+
+                        services.AddSingleton<PacketRecorder>();
+                        services.AddHostedService(sp => sp.GetRequiredService<PacketRecorder>());
+                        services.AddSingleton<IClientFactory, ClientFactory<ClientRecorder>>();
                     }
                     else
                     {
-                        if (debug.GameRecorderEnabled)
-                        {
-                            services.AddSingleton<ObjectPoolProvider>(new DefaultObjectPoolProvider());
-                            services.AddSingleton<ObjectPool<PacketSerializationContext>>(serviceProvider =>
-                            {
-                                var provider = serviceProvider.GetRequiredService<ObjectPoolProvider>();
-                                var policy = new PacketSerializationContextPooledObjectPolicy();
-                                return provider.Create(policy);
-                            });
-
-                            services.AddSingleton<PacketRecorder>();
-                            services.AddHostedService(sp => sp.GetRequiredService<PacketRecorder>());
-                            services.AddSingleton<IClientFactory, ClientFactory<ClientRecorder>>();
-                        }
-                        else
-                        {
-                            services.AddSingleton<IClientFactory, ClientFactory<Client>>();
-                        }
-
-                        services.AddSingleton<GameManager>();
-                        services.AddSingleton<IGameManager>(p => p.GetRequiredService<GameManager>());
+                        services.AddSingleton<IClientFactory, ClientFactory<Client>>();
                     }
 
+                    services.AddSingleton<GameManager>();
+                    services.AddSingleton<IGameManager>(p => p.GetRequiredService<GameManager>());
+
                     services.AddEventPools();
                     services.AddHazel();
                     services.AddSingleton<ICustomMessageManager<ICustomRootMessage>, CustomMessageManager<ICustomRootMessage>>();
index 5e583fbbe2d76cf25b192454d3303561a599fabf..97f62a0a0917ae06a9067b7a56e7bc3651ab636c 100644 (file)
@@ -9,20 +9,6 @@
     "Enabled": true,
     "BanIpFromGame": true
   },
-  "ServerRedirector": {
-    "Enabled": false,
-    "Master": true,
-    "Locator": {
-      "Redis": "127.0.0.1.6379",
-      "UdpMasterEndpoint": "127.0.0.1:32320"
-    },
-    "Nodes": [
-      {
-        "Ip": "127.0.0.1",
-        "Port": 22024
-      }
-    ]
-  },
   "Compatibility": {
     "AllowFutureGameVersions": false,
     "AllowVersionMixing": false
index 72f95043012a579b8aad909d9103cd87b97bd023..b28bd0fea54c619c6edfa6a0b009ae8b73fe2797 100644 (file)
           "Serilog": "2.12.0"
         }
       },
-      "Microsoft.Extensions.Caching.StackExchangeRedis": {
-        "type": "Direct",
-        "requested": "[7.0.1, )",
-        "resolved": "7.0.1",
-        "contentHash": "YtwtXPy5sBBkfj7kZkDEHwiMxgUZC0Coqq0x9ViL2zvj2nHBesNvJz/gFCLsFzEvw8UFfzHT1KGKG/QGI2cLVg==",
-        "dependencies": {
-          "Microsoft.Extensions.Caching.Abstractions": "7.0.0",
-          "Microsoft.Extensions.Logging.Abstractions": "7.0.0",
-          "Microsoft.Extensions.Options": "7.0.0",
-          "StackExchange.Redis": "2.2.4"
-        }
-      },
       "Microsoft.Extensions.FileSystemGlobbing": {
         "type": "Direct",
         "requested": "[7.0.0, )",
         "resolved": "1.0.0",
         "contentHash": "x56AEsY5fKU2Z5O7ZrzEqKfr62kq/C05Aevcciwz5yMfOQlpwuFI1awgNGJsoe+bcx+XnFc3+l+eadtY72aZsg=="
       },
-      "Microsoft.Extensions.Caching.Abstractions": {
-        "type": "Transitive",
-        "resolved": "7.0.0",
-        "contentHash": "IeimUd0TNbhB4ded3AbgBLQv2SnsiVugDyGV1MvspQFVlA07nDC7Zul7kcwH5jWN3JiTcp/ySE83AIJo8yfKjg==",
-        "dependencies": {
-          "Microsoft.Extensions.Primitives": "7.0.0"
-        }
-      },
       "Microsoft.Extensions.Configuration": {
         "type": "Transitive",
         "resolved": "7.0.0",
         "resolved": "7.0.0",
         "contentHash": "um1KU5kxcRp3CNuI8o/GrZtD4AIOXDk+RLsytjZ9QPok3ttLUelLKpilVPuaFT3TFjOhSibUAso0odbOaCDj3Q=="
       },
-      "Microsoft.NETCore.Platforms": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ=="
-      },
-      "Microsoft.Win32.Registry": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==",
-        "dependencies": {
-          "System.Security.AccessControl": "5.0.0",
-          "System.Security.Principal.Windows": "5.0.0"
-        }
-      },
-      "Microsoft.Win32.SystemEvents": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "Bh6blKG8VAKvXiLe2L+sEsn62nc1Ij34MrNxepD2OCrS5cpCwQa9MeLyhVQPQ/R4Wlzwuy6wMK8hLb11QPDRsQ==",
-        "dependencies": {
-          "Microsoft.NETCore.Platforms": "5.0.0"
-        }
-      },
-      "Pipelines.Sockets.Unofficial": {
-        "type": "Transitive",
-        "resolved": "2.2.0",
-        "contentHash": "7hzHplEIVOGBl5zOQZGX/DiJDHjq+RVRVrYgDiqXb6RriqWAdacXxp+XO9WSrATCEXyNOUOQg9aqQArsjase/A==",
-        "dependencies": {
-          "System.IO.Pipelines": "5.0.0"
-        }
-      },
       "Serilog": {
         "type": "Transitive",
         "resolved": "2.12.0",
           "Serilog": "2.9.0"
         }
       },
-      "StackExchange.Redis": {
-        "type": "Transitive",
-        "resolved": "2.2.4",
-        "contentHash": "wM0OuRyRaZTFndFRjIOvas4jjkeclRJsmNm0eAx5tOju3SQisrLubNaSFT/dBypi4Vh1n7nYc1gWpw9L7ernOg==",
-        "dependencies": {
-          "Pipelines.Sockets.Unofficial": "2.2.0",
-          "System.Diagnostics.PerformanceCounter": "5.0.0"
-        }
-      },
-      "System.Configuration.ConfigurationManager": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "aM7cbfEfVNlEEOj3DsZP+2g9NRwbkyiAv2isQEzw7pnkDg9ekCU2m1cdJLM02Uq691OaCS91tooaxcEn8d0q5w==",
-        "dependencies": {
-          "System.Security.Cryptography.ProtectedData": "5.0.0",
-          "System.Security.Permissions": "5.0.0"
-        }
-      },
       "System.Diagnostics.EventLog": {
         "type": "Transitive",
         "resolved": "7.0.0",
         "contentHash": "eUDP47obqQm3SFJfP6z+Fx2nJ4KKTQbXB4Q9Uesnzw9SbYdhjyoGXuvDn/gEmFY6N5Z3bFFbpAQGA7m6hrYJCw=="
       },
-      "System.Diagnostics.PerformanceCounter": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "kcQWWtGVC3MWMNXdMDWfrmIlFZZ2OdoeT6pSNVRtk9+Sa7jwdPiMlNwb0ZQcS7NRlT92pCfmjRtkSWUW3RAKwg==",
-        "dependencies": {
-          "Microsoft.NETCore.Platforms": "5.0.0",
-          "Microsoft.Win32.Registry": "5.0.0",
-          "System.Configuration.ConfigurationManager": "5.0.0",
-          "System.Security.Principal.Windows": "5.0.0"
-        }
-      },
-      "System.Drawing.Common": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "SztFwAnpfKC8+sEKXAFxCBWhKQaEd97EiOL7oZJZP56zbqnLpmxACWA8aGseaUExciuEAUuR9dY8f7HkTRAdnw==",
-        "dependencies": {
-          "Microsoft.Win32.SystemEvents": "5.0.0"
-        }
-      },
-      "System.IO.Pipelines": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "irMYm3vhVgRsYvHTU5b2gsT2CwT/SMM6LZFzuJjpIvT5Z4CshxNsaoBC1X/LltwuR3Opp8d6jOS/60WwOb7Q2Q=="
-      },
-      "System.Security.AccessControl": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==",
-        "dependencies": {
-          "Microsoft.NETCore.Platforms": "5.0.0",
-          "System.Security.Principal.Windows": "5.0.0"
-        }
-      },
-      "System.Security.Cryptography.ProtectedData": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "HGxMSAFAPLNoxBvSfW08vHde0F9uh7BjASwu6JF9JnXuEPhCY3YUqURn0+bQV/4UWeaqymmrHWV+Aw9riQCtCA=="
-      },
-      "System.Security.Permissions": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "uE8juAhEkp7KDBCdjDIE3H9R1HJuEHqeqX8nLX9gmYKWwsqk3T5qZlPx8qle5DPKimC/Fy3AFTdV7HamgCh9qQ==",
-        "dependencies": {
-          "System.Security.AccessControl": "5.0.0",
-          "System.Windows.Extensions": "5.0.0"
-        }
-      },
-      "System.Security.Principal.Windows": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA=="
-      },
       "System.Text.Encodings.Web": {
         "type": "Transitive",
         "resolved": "7.0.0",
           "System.Text.Encodings.Web": "7.0.0"
         }
       },
-      "System.Windows.Extensions": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "c1ho9WU9ZxMZawML+ssPKZfdnrg/OjR3pe0m9v8230z3acqphwvPJqzAkH54xRYm5ntZHGG1EPP3sux9H3qSPg==",
-        "dependencies": {
-          "System.Drawing.Common": "5.0.0"
-        }
-      },
       "impostor.api": {
         "type": "Project",
         "dependencies": {
       }
     },
     "net7.0/linux-arm": {
-      "Microsoft.Win32.Registry": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==",
-        "dependencies": {
-          "System.Security.AccessControl": "5.0.0",
-          "System.Security.Principal.Windows": "5.0.0"
-        }
-      },
-      "Microsoft.Win32.SystemEvents": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "Bh6blKG8VAKvXiLe2L+sEsn62nc1Ij34MrNxepD2OCrS5cpCwQa9MeLyhVQPQ/R4Wlzwuy6wMK8hLb11QPDRsQ==",
-        "dependencies": {
-          "Microsoft.NETCore.Platforms": "5.0.0"
-        }
-      },
       "System.Diagnostics.EventLog": {
         "type": "Transitive",
         "resolved": "7.0.0",
         "contentHash": "eUDP47obqQm3SFJfP6z+Fx2nJ4KKTQbXB4Q9Uesnzw9SbYdhjyoGXuvDn/gEmFY6N5Z3bFFbpAQGA7m6hrYJCw=="
       },
-      "System.Diagnostics.PerformanceCounter": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "kcQWWtGVC3MWMNXdMDWfrmIlFZZ2OdoeT6pSNVRtk9+Sa7jwdPiMlNwb0ZQcS7NRlT92pCfmjRtkSWUW3RAKwg==",
-        "dependencies": {
-          "Microsoft.NETCore.Platforms": "5.0.0",
-          "Microsoft.Win32.Registry": "5.0.0",
-          "System.Configuration.ConfigurationManager": "5.0.0",
-          "System.Security.Principal.Windows": "5.0.0"
-        }
-      },
-      "System.Drawing.Common": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "SztFwAnpfKC8+sEKXAFxCBWhKQaEd97EiOL7oZJZP56zbqnLpmxACWA8aGseaUExciuEAUuR9dY8f7HkTRAdnw==",
-        "dependencies": {
-          "Microsoft.Win32.SystemEvents": "5.0.0"
-        }
-      },
-      "System.Security.AccessControl": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==",
-        "dependencies": {
-          "Microsoft.NETCore.Platforms": "5.0.0",
-          "System.Security.Principal.Windows": "5.0.0"
-        }
-      },
-      "System.Security.Cryptography.ProtectedData": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "HGxMSAFAPLNoxBvSfW08vHde0F9uh7BjASwu6JF9JnXuEPhCY3YUqURn0+bQV/4UWeaqymmrHWV+Aw9riQCtCA=="
-      },
-      "System.Security.Principal.Windows": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA=="
-      },
       "System.Text.Encodings.Web": {
         "type": "Transitive",
         "resolved": "7.0.0",
         "contentHash": "OP6umVGxc0Z0MvZQBVigj4/U31Pw72ITihDWP9WiWDm+q5aoe0GaJivsfYGq53o6dxH7DcXWiCTl7+0o2CGdmg=="
-      },
-      "System.Windows.Extensions": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "c1ho9WU9ZxMZawML+ssPKZfdnrg/OjR3pe0m9v8230z3acqphwvPJqzAkH54xRYm5ntZHGG1EPP3sux9H3qSPg==",
-        "dependencies": {
-          "System.Drawing.Common": "5.0.0"
-        }
       }
     },
     "net7.0/linux-arm64": {
-      "Microsoft.Win32.Registry": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==",
-        "dependencies": {
-          "System.Security.AccessControl": "5.0.0",
-          "System.Security.Principal.Windows": "5.0.0"
-        }
-      },
-      "Microsoft.Win32.SystemEvents": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "Bh6blKG8VAKvXiLe2L+sEsn62nc1Ij34MrNxepD2OCrS5cpCwQa9MeLyhVQPQ/R4Wlzwuy6wMK8hLb11QPDRsQ==",
-        "dependencies": {
-          "Microsoft.NETCore.Platforms": "5.0.0"
-        }
-      },
       "System.Diagnostics.EventLog": {
         "type": "Transitive",
         "resolved": "7.0.0",
         "contentHash": "eUDP47obqQm3SFJfP6z+Fx2nJ4KKTQbXB4Q9Uesnzw9SbYdhjyoGXuvDn/gEmFY6N5Z3bFFbpAQGA7m6hrYJCw=="
       },
-      "System.Diagnostics.PerformanceCounter": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "kcQWWtGVC3MWMNXdMDWfrmIlFZZ2OdoeT6pSNVRtk9+Sa7jwdPiMlNwb0ZQcS7NRlT92pCfmjRtkSWUW3RAKwg==",
-        "dependencies": {
-          "Microsoft.NETCore.Platforms": "5.0.0",
-          "Microsoft.Win32.Registry": "5.0.0",
-          "System.Configuration.ConfigurationManager": "5.0.0",
-          "System.Security.Principal.Windows": "5.0.0"
-        }
-      },
-      "System.Drawing.Common": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "SztFwAnpfKC8+sEKXAFxCBWhKQaEd97EiOL7oZJZP56zbqnLpmxACWA8aGseaUExciuEAUuR9dY8f7HkTRAdnw==",
-        "dependencies": {
-          "Microsoft.Win32.SystemEvents": "5.0.0"
-        }
-      },
-      "System.Security.AccessControl": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==",
-        "dependencies": {
-          "Microsoft.NETCore.Platforms": "5.0.0",
-          "System.Security.Principal.Windows": "5.0.0"
-        }
-      },
-      "System.Security.Cryptography.ProtectedData": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "HGxMSAFAPLNoxBvSfW08vHde0F9uh7BjASwu6JF9JnXuEPhCY3YUqURn0+bQV/4UWeaqymmrHWV+Aw9riQCtCA=="
-      },
-      "System.Security.Principal.Windows": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA=="
-      },
       "System.Text.Encodings.Web": {
         "type": "Transitive",
         "resolved": "7.0.0",
         "contentHash": "OP6umVGxc0Z0MvZQBVigj4/U31Pw72ITihDWP9WiWDm+q5aoe0GaJivsfYGq53o6dxH7DcXWiCTl7+0o2CGdmg=="
-      },
-      "System.Windows.Extensions": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "c1ho9WU9ZxMZawML+ssPKZfdnrg/OjR3pe0m9v8230z3acqphwvPJqzAkH54xRYm5ntZHGG1EPP3sux9H3qSPg==",
-        "dependencies": {
-          "System.Drawing.Common": "5.0.0"
-        }
       }
     },
     "net7.0/linux-x64": {
-      "Microsoft.Win32.Registry": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==",
-        "dependencies": {
-          "System.Security.AccessControl": "5.0.0",
-          "System.Security.Principal.Windows": "5.0.0"
-        }
-      },
-      "Microsoft.Win32.SystemEvents": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "Bh6blKG8VAKvXiLe2L+sEsn62nc1Ij34MrNxepD2OCrS5cpCwQa9MeLyhVQPQ/R4Wlzwuy6wMK8hLb11QPDRsQ==",
-        "dependencies": {
-          "Microsoft.NETCore.Platforms": "5.0.0"
-        }
-      },
       "System.Diagnostics.EventLog": {
         "type": "Transitive",
         "resolved": "7.0.0",
         "contentHash": "eUDP47obqQm3SFJfP6z+Fx2nJ4KKTQbXB4Q9Uesnzw9SbYdhjyoGXuvDn/gEmFY6N5Z3bFFbpAQGA7m6hrYJCw=="
       },
-      "System.Diagnostics.PerformanceCounter": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "kcQWWtGVC3MWMNXdMDWfrmIlFZZ2OdoeT6pSNVRtk9+Sa7jwdPiMlNwb0ZQcS7NRlT92pCfmjRtkSWUW3RAKwg==",
-        "dependencies": {
-          "Microsoft.NETCore.Platforms": "5.0.0",
-          "Microsoft.Win32.Registry": "5.0.0",
-          "System.Configuration.ConfigurationManager": "5.0.0",
-          "System.Security.Principal.Windows": "5.0.0"
-        }
-      },
-      "System.Drawing.Common": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "SztFwAnpfKC8+sEKXAFxCBWhKQaEd97EiOL7oZJZP56zbqnLpmxACWA8aGseaUExciuEAUuR9dY8f7HkTRAdnw==",
-        "dependencies": {
-          "Microsoft.Win32.SystemEvents": "5.0.0"
-        }
-      },
-      "System.Security.AccessControl": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==",
-        "dependencies": {
-          "Microsoft.NETCore.Platforms": "5.0.0",
-          "System.Security.Principal.Windows": "5.0.0"
-        }
-      },
-      "System.Security.Cryptography.ProtectedData": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "HGxMSAFAPLNoxBvSfW08vHde0F9uh7BjASwu6JF9JnXuEPhCY3YUqURn0+bQV/4UWeaqymmrHWV+Aw9riQCtCA=="
-      },
-      "System.Security.Principal.Windows": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA=="
-      },
       "System.Text.Encodings.Web": {
         "type": "Transitive",
         "resolved": "7.0.0",
         "contentHash": "OP6umVGxc0Z0MvZQBVigj4/U31Pw72ITihDWP9WiWDm+q5aoe0GaJivsfYGq53o6dxH7DcXWiCTl7+0o2CGdmg=="
-      },
-      "System.Windows.Extensions": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "c1ho9WU9ZxMZawML+ssPKZfdnrg/OjR3pe0m9v8230z3acqphwvPJqzAkH54xRYm5ntZHGG1EPP3sux9H3qSPg==",
-        "dependencies": {
-          "System.Drawing.Common": "5.0.0"
-        }
       }
     },
     "net7.0/osx-x64": {
-      "Microsoft.Win32.Registry": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==",
-        "dependencies": {
-          "System.Security.AccessControl": "5.0.0",
-          "System.Security.Principal.Windows": "5.0.0"
-        }
-      },
-      "Microsoft.Win32.SystemEvents": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "Bh6blKG8VAKvXiLe2L+sEsn62nc1Ij34MrNxepD2OCrS5cpCwQa9MeLyhVQPQ/R4Wlzwuy6wMK8hLb11QPDRsQ==",
-        "dependencies": {
-          "Microsoft.NETCore.Platforms": "5.0.0"
-        }
-      },
       "System.Diagnostics.EventLog": {
         "type": "Transitive",
         "resolved": "7.0.0",
         "contentHash": "eUDP47obqQm3SFJfP6z+Fx2nJ4KKTQbXB4Q9Uesnzw9SbYdhjyoGXuvDn/gEmFY6N5Z3bFFbpAQGA7m6hrYJCw=="
       },
-      "System.Diagnostics.PerformanceCounter": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "kcQWWtGVC3MWMNXdMDWfrmIlFZZ2OdoeT6pSNVRtk9+Sa7jwdPiMlNwb0ZQcS7NRlT92pCfmjRtkSWUW3RAKwg==",
-        "dependencies": {
-          "Microsoft.NETCore.Platforms": "5.0.0",
-          "Microsoft.Win32.Registry": "5.0.0",
-          "System.Configuration.ConfigurationManager": "5.0.0",
-          "System.Security.Principal.Windows": "5.0.0"
-        }
-      },
-      "System.Drawing.Common": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "SztFwAnpfKC8+sEKXAFxCBWhKQaEd97EiOL7oZJZP56zbqnLpmxACWA8aGseaUExciuEAUuR9dY8f7HkTRAdnw==",
-        "dependencies": {
-          "Microsoft.Win32.SystemEvents": "5.0.0"
-        }
-      },
-      "System.Security.AccessControl": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==",
-        "dependencies": {
-          "Microsoft.NETCore.Platforms": "5.0.0",
-          "System.Security.Principal.Windows": "5.0.0"
-        }
-      },
-      "System.Security.Cryptography.ProtectedData": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "HGxMSAFAPLNoxBvSfW08vHde0F9uh7BjASwu6JF9JnXuEPhCY3YUqURn0+bQV/4UWeaqymmrHWV+Aw9riQCtCA=="
-      },
-      "System.Security.Principal.Windows": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA=="
-      },
       "System.Text.Encodings.Web": {
         "type": "Transitive",
         "resolved": "7.0.0",
         "contentHash": "OP6umVGxc0Z0MvZQBVigj4/U31Pw72ITihDWP9WiWDm+q5aoe0GaJivsfYGq53o6dxH7DcXWiCTl7+0o2CGdmg=="
-      },
-      "System.Windows.Extensions": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "c1ho9WU9ZxMZawML+ssPKZfdnrg/OjR3pe0m9v8230z3acqphwvPJqzAkH54xRYm5ntZHGG1EPP3sux9H3qSPg==",
-        "dependencies": {
-          "System.Drawing.Common": "5.0.0"
-        }
       }
     },
     "net7.0/win-x64": {
-      "Microsoft.Win32.Registry": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==",
-        "dependencies": {
-          "System.Security.AccessControl": "5.0.0",
-          "System.Security.Principal.Windows": "5.0.0"
-        }
-      },
-      "Microsoft.Win32.SystemEvents": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "Bh6blKG8VAKvXiLe2L+sEsn62nc1Ij34MrNxepD2OCrS5cpCwQa9MeLyhVQPQ/R4Wlzwuy6wMK8hLb11QPDRsQ==",
-        "dependencies": {
-          "Microsoft.NETCore.Platforms": "5.0.0"
-        }
-      },
       "System.Diagnostics.EventLog": {
         "type": "Transitive",
         "resolved": "7.0.0",
         "contentHash": "eUDP47obqQm3SFJfP6z+Fx2nJ4KKTQbXB4Q9Uesnzw9SbYdhjyoGXuvDn/gEmFY6N5Z3bFFbpAQGA7m6hrYJCw=="
       },
-      "System.Diagnostics.PerformanceCounter": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "kcQWWtGVC3MWMNXdMDWfrmIlFZZ2OdoeT6pSNVRtk9+Sa7jwdPiMlNwb0ZQcS7NRlT92pCfmjRtkSWUW3RAKwg==",
-        "dependencies": {
-          "Microsoft.NETCore.Platforms": "5.0.0",
-          "Microsoft.Win32.Registry": "5.0.0",
-          "System.Configuration.ConfigurationManager": "5.0.0",
-          "System.Security.Principal.Windows": "5.0.0"
-        }
-      },
-      "System.Drawing.Common": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "SztFwAnpfKC8+sEKXAFxCBWhKQaEd97EiOL7oZJZP56zbqnLpmxACWA8aGseaUExciuEAUuR9dY8f7HkTRAdnw==",
-        "dependencies": {
-          "Microsoft.Win32.SystemEvents": "5.0.0"
-        }
-      },
-      "System.Security.AccessControl": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==",
-        "dependencies": {
-          "Microsoft.NETCore.Platforms": "5.0.0",
-          "System.Security.Principal.Windows": "5.0.0"
-        }
-      },
-      "System.Security.Cryptography.ProtectedData": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "HGxMSAFAPLNoxBvSfW08vHde0F9uh7BjASwu6JF9JnXuEPhCY3YUqURn0+bQV/4UWeaqymmrHWV+Aw9riQCtCA=="
-      },
-      "System.Security.Principal.Windows": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA=="
-      },
       "System.Text.Encodings.Web": {
         "type": "Transitive",
         "resolved": "7.0.0",
         "contentHash": "OP6umVGxc0Z0MvZQBVigj4/U31Pw72ITihDWP9WiWDm+q5aoe0GaJivsfYGq53o6dxH7DcXWiCTl7+0o2CGdmg=="
-      },
-      "System.Windows.Extensions": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "c1ho9WU9ZxMZawML+ssPKZfdnrg/OjR3pe0m9v8230z3acqphwvPJqzAkH54xRYm5ntZHGG1EPP3sux9H3qSPg==",
-        "dependencies": {
-          "System.Drawing.Common": "5.0.0"
-        }
       }
     }
   }
index 185fb1fe2c3bbee9cda99ff836496192eab4e324..fcf2b2f0cc96fc0877582f64b6cc3784bc0289c4 100644 (file)
         "resolved": "17.4.1",
         "contentHash": "T21KxaiFawbrrjm0uXjxAStXaBm5P9H6Nnf8BUtBTvIpd8q57lrChVBCY2dnazmSu9/kuX4z5+kAOT78Dod7vA=="
       },
-      "Microsoft.Extensions.Caching.Abstractions": {
-        "type": "Transitive",
-        "resolved": "7.0.0",
-        "contentHash": "IeimUd0TNbhB4ded3AbgBLQv2SnsiVugDyGV1MvspQFVlA07nDC7Zul7kcwH5jWN3JiTcp/ySE83AIJo8yfKjg==",
-        "dependencies": {
-          "Microsoft.Extensions.Primitives": "7.0.0"
-        }
-      },
-      "Microsoft.Extensions.Caching.StackExchangeRedis": {
-        "type": "Transitive",
-        "resolved": "7.0.1",
-        "contentHash": "YtwtXPy5sBBkfj7kZkDEHwiMxgUZC0Coqq0x9ViL2zvj2nHBesNvJz/gFCLsFzEvw8UFfzHT1KGKG/QGI2cLVg==",
-        "dependencies": {
-          "Microsoft.Extensions.Caching.Abstractions": "7.0.0",
-          "Microsoft.Extensions.Logging.Abstractions": "7.0.0",
-          "Microsoft.Extensions.Options": "7.0.0",
-          "StackExchange.Redis": "2.2.4"
-        }
-      },
       "Microsoft.Extensions.Configuration": {
         "type": "Transitive",
         "resolved": "7.0.0",
       },
       "Microsoft.NETCore.Platforms": {
         "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ=="
+        "resolved": "1.1.0",
+        "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A=="
       },
       "Microsoft.NETCore.Targets": {
         "type": "Transitive",
           "System.Runtime": "4.3.0"
         }
       },
-      "Microsoft.Win32.Registry": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==",
-        "dependencies": {
-          "System.Security.AccessControl": "5.0.0",
-          "System.Security.Principal.Windows": "5.0.0"
-        }
-      },
-      "Microsoft.Win32.SystemEvents": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "Bh6blKG8VAKvXiLe2L+sEsn62nc1Ij34MrNxepD2OCrS5cpCwQa9MeLyhVQPQ/R4Wlzwuy6wMK8hLb11QPDRsQ==",
-        "dependencies": {
-          "Microsoft.NETCore.Platforms": "5.0.0"
-        }
-      },
       "NETStandard.Library": {
         "type": "Transitive",
         "resolved": "1.6.1",
         "resolved": "5.11.0",
         "contentHash": "eaiXkUjC4NPcquGWzAGMXjuxvLwc6XGKMptSyOGQeT0X70BUZObuybJFZLA0OfTdueLd3US23NBPTBb6iF3V1Q=="
       },
-      "Pipelines.Sockets.Unofficial": {
-        "type": "Transitive",
-        "resolved": "2.2.0",
-        "contentHash": "7hzHplEIVOGBl5zOQZGX/DiJDHjq+RVRVrYgDiqXb6RriqWAdacXxp+XO9WSrATCEXyNOUOQg9aqQArsjase/A==",
-        "dependencies": {
-          "System.IO.Pipelines": "5.0.0"
-        }
-      },
       "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
         "type": "Transitive",
         "resolved": "4.3.0",
           "Serilog": "2.10.0"
         }
       },
-      "StackExchange.Redis": {
-        "type": "Transitive",
-        "resolved": "2.2.4",
-        "contentHash": "wM0OuRyRaZTFndFRjIOvas4jjkeclRJsmNm0eAx5tOju3SQisrLubNaSFT/dBypi4Vh1n7nYc1gWpw9L7ernOg==",
-        "dependencies": {
-          "Pipelines.Sockets.Unofficial": "2.2.0",
-          "System.Diagnostics.PerformanceCounter": "5.0.0"
-        }
-      },
       "System.AppContext": {
         "type": "Transitive",
         "resolved": "4.3.0",
           "System.Threading.Tasks": "4.3.0"
         }
       },
-      "System.Configuration.ConfigurationManager": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "aM7cbfEfVNlEEOj3DsZP+2g9NRwbkyiAv2isQEzw7pnkDg9ekCU2m1cdJLM02Uq691OaCS91tooaxcEn8d0q5w==",
-        "dependencies": {
-          "System.Security.Cryptography.ProtectedData": "5.0.0",
-          "System.Security.Permissions": "5.0.0"
-        }
-      },
       "System.Console": {
         "type": "Transitive",
         "resolved": "4.3.0",
         "resolved": "7.0.0",
         "contentHash": "eUDP47obqQm3SFJfP6z+Fx2nJ4KKTQbXB4Q9Uesnzw9SbYdhjyoGXuvDn/gEmFY6N5Z3bFFbpAQGA7m6hrYJCw=="
       },
-      "System.Diagnostics.PerformanceCounter": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "kcQWWtGVC3MWMNXdMDWfrmIlFZZ2OdoeT6pSNVRtk9+Sa7jwdPiMlNwb0ZQcS7NRlT92pCfmjRtkSWUW3RAKwg==",
-        "dependencies": {
-          "Microsoft.NETCore.Platforms": "5.0.0",
-          "Microsoft.Win32.Registry": "5.0.0",
-          "System.Configuration.ConfigurationManager": "5.0.0",
-          "System.Security.Principal.Windows": "5.0.0"
-        }
-      },
       "System.Diagnostics.Tools": {
         "type": "Transitive",
         "resolved": "4.3.0",
           "System.Runtime": "4.3.0"
         }
       },
-      "System.Drawing.Common": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "SztFwAnpfKC8+sEKXAFxCBWhKQaEd97EiOL7oZJZP56zbqnLpmxACWA8aGseaUExciuEAUuR9dY8f7HkTRAdnw==",
-        "dependencies": {
-          "Microsoft.Win32.SystemEvents": "5.0.0"
-        }
-      },
       "System.Globalization": {
         "type": "Transitive",
         "resolved": "4.3.0",
           "System.Runtime": "4.3.0"
         }
       },
-      "System.IO.Pipelines": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "irMYm3vhVgRsYvHTU5b2gsT2CwT/SMM6LZFzuJjpIvT5Z4CshxNsaoBC1X/LltwuR3Opp8d6jOS/60WwOb7Q2Q=="
-      },
       "System.Linq": {
         "type": "Transitive",
         "resolved": "4.3.0",
           "System.Runtime.Extensions": "4.3.0"
         }
       },
-      "System.Security.AccessControl": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==",
-        "dependencies": {
-          "Microsoft.NETCore.Platforms": "5.0.0",
-          "System.Security.Principal.Windows": "5.0.0"
-        }
-      },
       "System.Security.Cryptography.Algorithms": {
         "type": "Transitive",
         "resolved": "4.3.0",
           "System.Threading.Tasks": "4.3.0"
         }
       },
-      "System.Security.Cryptography.ProtectedData": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "HGxMSAFAPLNoxBvSfW08vHde0F9uh7BjASwu6JF9JnXuEPhCY3YUqURn0+bQV/4UWeaqymmrHWV+Aw9riQCtCA=="
-      },
       "System.Security.Cryptography.X509Certificates": {
         "type": "Transitive",
         "resolved": "4.3.0",
           "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0"
         }
       },
-      "System.Security.Permissions": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "uE8juAhEkp7KDBCdjDIE3H9R1HJuEHqeqX8nLX9gmYKWwsqk3T5qZlPx8qle5DPKimC/Fy3AFTdV7HamgCh9qQ==",
-        "dependencies": {
-          "System.Security.AccessControl": "5.0.0",
-          "System.Windows.Extensions": "5.0.0"
-        }
-      },
-      "System.Security.Principal.Windows": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA=="
-      },
       "System.Text.Encoding": {
         "type": "Transitive",
         "resolved": "4.3.0",
           "System.Runtime": "4.3.0"
         }
       },
-      "System.Windows.Extensions": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "c1ho9WU9ZxMZawML+ssPKZfdnrg/OjR3pe0m9v8230z3acqphwvPJqzAkH54xRYm5ntZHGG1EPP3sux9H3qSPg==",
-        "dependencies": {
-          "System.Drawing.Common": "5.0.0"
-        }
-      },
       "System.Xml.ReaderWriter": {
         "type": "Transitive",
         "resolved": "4.3.0",
         "dependencies": {
           "Impostor.Api": "[1.7.3-dev, )",
           "Impostor.Hazel": "[1.0.0, )",
-          "Microsoft.Extensions.Caching.StackExchangeRedis": "[7.0.1, )",
           "Microsoft.Extensions.FileSystemGlobbing": "[7.0.0, )",
           "Microsoft.Extensions.Hosting": "[7.0.0, )",
           "Microsoft.Extensions.ObjectPool": "[7.0.1, )",
index 6b80c0843016374e8077bac5630ffb01897e7ae4..dff561515f72419bb2ebc65a0e56df6780afe9a2 100644 (file)
@@ -22,7 +22,6 @@ using Impostor.Server.Net;
 using Impostor.Server.Net.Custom;
 using Impostor.Server.Net.Factories;
 using Impostor.Server.Net.Manager;
-using Impostor.Server.Net.Redirector;
 using Impostor.Server.Recorder;
 using Impostor.Server.Utils;
 using Impostor.Tools.ServerReplay.Mocks;
@@ -112,7 +111,6 @@ namespace Impostor.Tools.ServerReplay
 
             services.AddSingleton<ClientManager>();
             services.AddSingleton<IClientFactory, ClientFactory<Client>>();
-            services.AddSingleton<INodeLocator, NodeLocatorNoOp>();
             services.AddSingleton<IEventManager, EventManager>();
 
             services.AddEventPools();
index e94b6b279af63f99ca395d19f5ad56d4340a627a..7e0296904bd2cff9d682d8069294264f8a6b3dee 100644 (file)
         "resolved": "1.0.0",
         "contentHash": "x56AEsY5fKU2Z5O7ZrzEqKfr62kq/C05Aevcciwz5yMfOQlpwuFI1awgNGJsoe+bcx+XnFc3+l+eadtY72aZsg=="
       },
-      "Microsoft.Extensions.Caching.Abstractions": {
-        "type": "Transitive",
-        "resolved": "7.0.0",
-        "contentHash": "IeimUd0TNbhB4ded3AbgBLQv2SnsiVugDyGV1MvspQFVlA07nDC7Zul7kcwH5jWN3JiTcp/ySE83AIJo8yfKjg==",
-        "dependencies": {
-          "Microsoft.Extensions.Primitives": "7.0.0"
-        }
-      },
-      "Microsoft.Extensions.Caching.StackExchangeRedis": {
-        "type": "Transitive",
-        "resolved": "7.0.1",
-        "contentHash": "YtwtXPy5sBBkfj7kZkDEHwiMxgUZC0Coqq0x9ViL2zvj2nHBesNvJz/gFCLsFzEvw8UFfzHT1KGKG/QGI2cLVg==",
-        "dependencies": {
-          "Microsoft.Extensions.Caching.Abstractions": "7.0.0",
-          "Microsoft.Extensions.Logging.Abstractions": "7.0.0",
-          "Microsoft.Extensions.Options": "7.0.0",
-          "StackExchange.Redis": "2.2.4"
-        }
-      },
       "Microsoft.Extensions.Configuration": {
         "type": "Transitive",
         "resolved": "7.0.0",
         "resolved": "7.0.0",
         "contentHash": "um1KU5kxcRp3CNuI8o/GrZtD4AIOXDk+RLsytjZ9QPok3ttLUelLKpilVPuaFT3TFjOhSibUAso0odbOaCDj3Q=="
       },
-      "Microsoft.NETCore.Platforms": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ=="
-      },
-      "Microsoft.Win32.Registry": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==",
-        "dependencies": {
-          "System.Security.AccessControl": "5.0.0",
-          "System.Security.Principal.Windows": "5.0.0"
-        }
-      },
-      "Microsoft.Win32.SystemEvents": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "Bh6blKG8VAKvXiLe2L+sEsn62nc1Ij34MrNxepD2OCrS5cpCwQa9MeLyhVQPQ/R4Wlzwuy6wMK8hLb11QPDRsQ==",
-        "dependencies": {
-          "Microsoft.NETCore.Platforms": "5.0.0"
-        }
-      },
-      "Pipelines.Sockets.Unofficial": {
-        "type": "Transitive",
-        "resolved": "2.2.0",
-        "contentHash": "7hzHplEIVOGBl5zOQZGX/DiJDHjq+RVRVrYgDiqXb6RriqWAdacXxp+XO9WSrATCEXyNOUOQg9aqQArsjase/A==",
-        "dependencies": {
-          "System.IO.Pipelines": "5.0.0"
-        }
-      },
       "Serilog": {
         "type": "Transitive",
         "resolved": "2.12.0",
           "Serilog": "2.10.0"
         }
       },
-      "StackExchange.Redis": {
-        "type": "Transitive",
-        "resolved": "2.2.4",
-        "contentHash": "wM0OuRyRaZTFndFRjIOvas4jjkeclRJsmNm0eAx5tOju3SQisrLubNaSFT/dBypi4Vh1n7nYc1gWpw9L7ernOg==",
-        "dependencies": {
-          "Pipelines.Sockets.Unofficial": "2.2.0",
-          "System.Diagnostics.PerformanceCounter": "5.0.0"
-        }
-      },
-      "System.Configuration.ConfigurationManager": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "aM7cbfEfVNlEEOj3DsZP+2g9NRwbkyiAv2isQEzw7pnkDg9ekCU2m1cdJLM02Uq691OaCS91tooaxcEn8d0q5w==",
-        "dependencies": {
-          "System.Security.Cryptography.ProtectedData": "5.0.0",
-          "System.Security.Permissions": "5.0.0"
-        }
-      },
       "System.Diagnostics.EventLog": {
         "type": "Transitive",
         "resolved": "7.0.0",
         "contentHash": "eUDP47obqQm3SFJfP6z+Fx2nJ4KKTQbXB4Q9Uesnzw9SbYdhjyoGXuvDn/gEmFY6N5Z3bFFbpAQGA7m6hrYJCw=="
       },
-      "System.Diagnostics.PerformanceCounter": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "kcQWWtGVC3MWMNXdMDWfrmIlFZZ2OdoeT6pSNVRtk9+Sa7jwdPiMlNwb0ZQcS7NRlT92pCfmjRtkSWUW3RAKwg==",
-        "dependencies": {
-          "Microsoft.NETCore.Platforms": "5.0.0",
-          "Microsoft.Win32.Registry": "5.0.0",
-          "System.Configuration.ConfigurationManager": "5.0.0",
-          "System.Security.Principal.Windows": "5.0.0"
-        }
-      },
-      "System.Drawing.Common": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "SztFwAnpfKC8+sEKXAFxCBWhKQaEd97EiOL7oZJZP56zbqnLpmxACWA8aGseaUExciuEAUuR9dY8f7HkTRAdnw==",
-        "dependencies": {
-          "Microsoft.Win32.SystemEvents": "5.0.0"
-        }
-      },
-      "System.IO.Pipelines": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "irMYm3vhVgRsYvHTU5b2gsT2CwT/SMM6LZFzuJjpIvT5Z4CshxNsaoBC1X/LltwuR3Opp8d6jOS/60WwOb7Q2Q=="
-      },
-      "System.Security.AccessControl": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==",
-        "dependencies": {
-          "Microsoft.NETCore.Platforms": "5.0.0",
-          "System.Security.Principal.Windows": "5.0.0"
-        }
-      },
-      "System.Security.Cryptography.ProtectedData": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "HGxMSAFAPLNoxBvSfW08vHde0F9uh7BjASwu6JF9JnXuEPhCY3YUqURn0+bQV/4UWeaqymmrHWV+Aw9riQCtCA=="
-      },
-      "System.Security.Permissions": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "uE8juAhEkp7KDBCdjDIE3H9R1HJuEHqeqX8nLX9gmYKWwsqk3T5qZlPx8qle5DPKimC/Fy3AFTdV7HamgCh9qQ==",
-        "dependencies": {
-          "System.Security.AccessControl": "5.0.0",
-          "System.Windows.Extensions": "5.0.0"
-        }
-      },
-      "System.Security.Principal.Windows": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA=="
-      },
       "System.Text.Encodings.Web": {
         "type": "Transitive",
         "resolved": "7.0.0",
           "System.Text.Encodings.Web": "7.0.0"
         }
       },
-      "System.Windows.Extensions": {
-        "type": "Transitive",
-        "resolved": "5.0.0",
-        "contentHash": "c1ho9WU9ZxMZawML+ssPKZfdnrg/OjR3pe0m9v8230z3acqphwvPJqzAkH54xRYm5ntZHGG1EPP3sux9H3qSPg==",
-        "dependencies": {
-          "System.Drawing.Common": "5.0.0"
-        }
-      },
       "impostor.api": {
         "type": "Project",
         "dependencies": {
         "dependencies": {
           "Impostor.Api": "[1.7.3-dev, )",
           "Impostor.Hazel": "[1.0.0, )",
-          "Microsoft.Extensions.Caching.StackExchangeRedis": "[7.0.1, )",
           "Microsoft.Extensions.FileSystemGlobbing": "[7.0.0, )",
           "Microsoft.Extensions.Hosting": "[7.0.0, )",
           "Microsoft.Extensions.ObjectPool": "[7.0.1, )",