aboutsummaryrefslogtreecommitdiff
path: root/Libs/VNLib.Plugins.Essentials.Sessions/MemorySessionEntrypoint.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/MemorySessionEntrypoint.cs
Add project files.
Diffstat (limited to 'Libs/VNLib.Plugins.Essentials.Sessions/MemorySessionEntrypoint.cs')
-rw-r--r--Libs/VNLib.Plugins.Essentials.Sessions/MemorySessionEntrypoint.cs64
1 files changed, 64 insertions, 0 deletions
diff --git a/Libs/VNLib.Plugins.Essentials.Sessions/MemorySessionEntrypoint.cs b/Libs/VNLib.Plugins.Essentials.Sessions/MemorySessionEntrypoint.cs
new file mode 100644
index 0000000..f41d384
--- /dev/null
+++ b/Libs/VNLib.Plugins.Essentials.Sessions/MemorySessionEntrypoint.cs
@@ -0,0 +1,64 @@
+using System;
+using System.Text.Json;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Collections.Generic;
+
+
+using VNLib.Net.Http;
+using VNLib.Net.Sessions;
+using VNLib.Utils.Logging;
+using VNLib.Utils.Extensions;
+using VNLib.Plugins.Extensions.Loading.Configuration;
+using VNLib.Plugins.Extensions.Loading.Events;
+
+#nullable enable
+
+namespace VNLib.Plugins.Essentials.Sessions.Memory
+{
+ public sealed class MemorySessionEntrypoint : IRuntimeSessionProvider, IIntervalScheduleable
+ {
+ const string WEB_SESSION_CONFIG = "web";
+
+ private MemorySessionStore? _sessions;
+
+ bool IRuntimeSessionProvider.CanProcess(IHttpEvent entity)
+ {
+ //Web sessions can always be provided
+ return _sessions != null;
+ }
+
+ public ValueTask<SessionHandle> GetSessionAsync(IHttpEvent entity, CancellationToken cancellationToken)
+ {
+ return _sessions!.GetSessionAsync(entity, cancellationToken);
+ }
+
+ void IRuntimeSessionProvider.Load(PluginBase plugin, ILogProvider localized)
+ {
+ //Get websessions config element
+
+ IReadOnlyDictionary<string, JsonElement> webSessionConfig = plugin.GetConfig(WEB_SESSION_CONFIG);
+
+ MemorySessionConfig config = new()
+ {
+ SessionLog = localized,
+ MaxAllowedSessions = webSessionConfig["cache_size"].GetInt32(),
+ SessionIdSizeBytes = webSessionConfig["cookie_size"].GetUInt32(),
+ SessionTimeout = webSessionConfig["valid_for_sec"].GetTimeSpan(TimeParseType.Seconds),
+ SessionCookieID = webSessionConfig["cookie_name"].GetString() ?? throw new KeyNotFoundException($"Missing required element 'cookie_name' for config '{WEB_SESSION_CONFIG}'"),
+ };
+
+ _sessions = new(config);
+
+ //Schedule garbage collector
+ _ = plugin.ScheduleInterval(this, TimeSpan.FromMinutes(1));
+ }
+
+ Task IIntervalScheduleable.OnIntervalAsync(ILogProvider log, CancellationToken cancellationToken)
+ {
+ //Cleanup expired sessions on interval
+ _sessions?.GC();
+ return Task.CompletedTask;
+ }
+ }
+}