aboutsummaryrefslogtreecommitdiff
path: root/Libs/VNLib.Plugins.Essentials.Sessions.VNCache/WebSessionProviderEntry.cs
diff options
context:
space:
mode:
authorLibravatar vman <public@vaughnnugent.com>2022-10-30 02:28:12 -0400
committerLibravatar vman <public@vaughnnugent.com>2022-10-30 02:28:12 -0400
commita8510fb835dcc5e1142d700164ce5a4bd44e1a25 (patch)
tree28caab320f777a384cb6883b68dd999cdc8c0a3f /Libs/VNLib.Plugins.Essentials.Sessions.VNCache/WebSessionProviderEntry.cs
Add project files.
Diffstat (limited to 'Libs/VNLib.Plugins.Essentials.Sessions.VNCache/WebSessionProviderEntry.cs')
-rw-r--r--Libs/VNLib.Plugins.Essentials.Sessions.VNCache/WebSessionProviderEntry.cs101
1 files changed, 101 insertions, 0 deletions
diff --git a/Libs/VNLib.Plugins.Essentials.Sessions.VNCache/WebSessionProviderEntry.cs b/Libs/VNLib.Plugins.Essentials.Sessions.VNCache/WebSessionProviderEntry.cs
new file mode 100644
index 0000000..f72d1c5
--- /dev/null
+++ b/Libs/VNLib.Plugins.Essentials.Sessions.VNCache/WebSessionProviderEntry.cs
@@ -0,0 +1,101 @@
+using System.Text.Json;
+
+using VNLib.Net.Http;
+using VNLib.Utils.Memory;
+using VNLib.Utils.Logging;
+using VNLib.Utils.Extensions;
+using VNLib.Plugins.Extensions.Loading;
+using VNLib.Plugins.Extensions.Loading.Configuration;
+
+namespace VNLib.Plugins.Essentials.Sessions.VNCache
+{
+ public sealed class WebSessionProviderEntry : IRuntimeSessionProvider
+ {
+ const string VNCACHE_CONFIG_KEY = "vncache";
+ const string WEB_SESSION_CONFIG = "web";
+
+ private WebSessionProvider? _sessions;
+
+ public bool CanProcess(IHttpEvent entity)
+ {
+ //Web sessions can always be provided so long as cache is loaded
+ return _sessions != null;
+ }
+
+ public ValueTask<SessionHandle> GetSessionAsync(IHttpEvent entity, CancellationToken cancellationToken)
+ {
+ return _sessions!.GetSessionAsync(entity, cancellationToken);
+ }
+
+ void IRuntimeSessionProvider.Load(PluginBase plugin, ILogProvider localized)
+ {
+ //Try get vncache config element
+ IReadOnlyDictionary<string, JsonElement> cacheConfig = plugin.GetConfig(VNCACHE_CONFIG_KEY);
+
+ IReadOnlyDictionary<string, JsonElement> webSessionConfig = plugin.GetConfig(WEB_SESSION_CONFIG);
+
+ uint cookieSize = webSessionConfig["cookie_size"].GetUInt32();
+ string cookieName = webSessionConfig["cookie_name"].GetString() ?? throw new KeyNotFoundException($"Missing required element 'cookie_name' for config '{WEB_SESSION_CONFIG}'");
+ string cachePrefix = webSessionConfig["cache_prefix"].GetString() ?? throw new KeyNotFoundException($"Missing required element 'cache_prefix' for config '{WEB_SESSION_CONFIG}'");
+ TimeSpan validFor = webSessionConfig["valid_for_sec"].GetTimeSpan(TimeParseType.Seconds);
+
+
+ //Init id factory
+ WebSessionIdFactoryImpl idFactory = new(cookieSize, cookieName, cachePrefix, validFor);
+
+ //Run client connection
+ _ = WokerDoWorkAsync(plugin, localized, idFactory, cacheConfig, webSessionConfig);
+ }
+
+
+ /*
+ * Starts and monitors the VNCache connection
+ */
+
+ private async Task WokerDoWorkAsync(
+ PluginBase plugin,
+ ILogProvider localized,
+ WebSessionIdFactoryImpl idFactory,
+ IReadOnlyDictionary<string, JsonElement> cacheConfig,
+ IReadOnlyDictionary<string, JsonElement> webSessionConfig)
+ {
+ //Init cache client
+ using VnCacheClient cache = new(plugin.IsDebug() ? plugin.Log : null, Memory.Shared);
+
+ try
+ {
+ int cacheLimit = (int)webSessionConfig["cache_size"].GetUInt32();
+ uint maxConnections = webSessionConfig["max_waiting_connections"].GetUInt32();
+
+ //Try loading config
+ await cache.LoadConfigAsync(plugin, cacheConfig);
+
+ //Init provider
+ _sessions = new(cache.Resource!, cacheLimit, maxConnections, idFactory);
+
+
+ localized.Information("Session provider loaded");
+
+ //Run and wait for exit
+ await cache.RunAsync(localized, plugin.UnloadToken);
+
+ }
+ catch (OperationCanceledException)
+ { }
+ catch (KeyNotFoundException e)
+ {
+ localized.Error("Missing required configuration variable for VnCache client: {0}", e.Message);
+ }
+ catch (Exception ex)
+ {
+ localized.Error(ex, "Cache client error occured in session provider");
+ }
+ finally
+ {
+ _sessions = null;
+ }
+
+ localized.Information("Cache client exited");
+ }
+ }
+} \ No newline at end of file