- /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"
- }
- }
-}
-```
| **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.
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
```
- `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
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.";
+++ /dev/null
-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; }
- }
- }
-}
+++ /dev/null
-using System.Diagnostics.CodeAnalysis;
-
-namespace Impostor.Api.Config
-{
- public class ServerRedirectorNode
- {
- [AllowNull]
- public string Ip { get; set; }
-
- [AllowNull]
- public ushort Port { get; set; }
- }
-}
"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, )",
+++ /dev/null
-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;
- }
- }
-}
</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" />
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;
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;
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;
}
_logger.LogDebug("Remove game with code {0} ({1}).", GameCodeParser.IntToGameName(gameCode), gameCode);
- await _nodeLocator.RemoveAsync(GameCodeParser.IntToGameName(gameCode));
await _eventManager.CallAsync(new GameDestroyedEvent(game));
}
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++)
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));
{
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;
}
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)
+++ /dev/null
-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;
- }
- }
-}
+++ /dev/null
-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);
- }
-}
+++ /dev/null
-using System.Net;
-
-namespace Impostor.Server.Net.Redirector
-{
- internal interface INodeProvider
- {
- IPEndPoint Get();
- }
-}
+++ /dev/null
-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;
- }
-}
+++ /dev/null
-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);
- }
- }
-}
+++ /dev/null
-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);
- }
- }
-}
+++ /dev/null
-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.");
- }
- }
-}
+++ /dev/null
-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;
- }
- }
- }
-}
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;
.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>();
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>>();
"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
"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"
- }
}
}
}
"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, )",
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;
services.AddSingleton<ClientManager>();
services.AddSingleton<IClientFactory, ClientFactory<Client>>();
- services.AddSingleton<INodeLocator, NodeLocatorNoOp>();
services.AddSingleton<IEventManager, EventManager>();
services.AddEventPools();
"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, )",