diff options
Diffstat (limited to 'src/storage/session-manager/root.zig')
| -rw-r--r-- | src/storage/session-manager/root.zig | 78 |
1 files changed, 0 insertions, 78 deletions
diff --git a/src/storage/session-manager/root.zig b/src/storage/session-manager/root.zig deleted file mode 100644 index db95629..0000000 --- a/src/storage/session-manager/root.zig +++ /dev/null @@ -1,78 +0,0 @@ -const std = @import("std"); -const config = @import("../../config.zig"); -const Storage = @import("../root.zig"); - -pub const Session = @import("session.zig"); - -const Self = @This(); - -pub const empty: Self = .{ - .cache = .empty, -}; - -cache: std.StringHashMapUnmanaged(Session), -rw_lock: std.Thread.RwLock = .{}, - -pub fn add(self: *Self, storage: *Storage, info: Storage.User.Info) !*Session { - self.rw_lock.lock(); - defer self.rw_lock.unlock(); - - const session = try Session.init(storage.allocator, info); - errdefer session.deinit(storage.allocator); - try self.cache.put(storage.allocator, session.fingerprint, session); - return self.cache.getPtr(session.fingerprint) orelse unreachable; -} - -pub fn renew(self: *Self, storage: *Storage, fingerprint: []const u8) !*Session { - self.rw_lock.lockShared(); - if (self.cache.get(fingerprint)) |s| { - self.rw_lock.unlockShared(); - self.rw_lock.lock(); - defer self.rw_lock.unlock(); - - var session = s; - try session.reset(); - - try self.cache.put(storage.allocator, session.fingerprint, session); - - _ = self.cache.remove(fingerprint); - - return self.cache.getPtr(session.fingerprint) orelse unreachable; - } else { - self.rw_lock.unlockShared(); - } - return error.SessionNotFound; -} - -pub fn remove(self: *Self, storage: *Storage, fingerprint: []const u8) void { - self.rw_lock.lockShared(); - if (self.cache.contains(fingerprint)) { - self.rw_lock.unlockShared(); - self.rw_lock.lock(); - defer self.rw_lock.unlock(); - - const kv = self.cache.fetchRemove(fingerprint) orelse return; - kv.value.deinit(storage.allocator); - } else { - self.rw_lock.unlockShared(); - } -} - -pub fn get(self: *Self, storage: *Storage, fingerprint: []const u8) ?*Session { - self.rw_lock.lockShared(); - defer self.rw_lock.unlockShared(); - if (self.cache.getPtr(fingerprint)) |session| { - const now = std.time.Instant.now() catch return null; - const since = now.since(session.age); - - if (since > storage.config.session_expires_after) { - session.deinit(storage.allocator); - _ = self.cache.remove(fingerprint); - return null; - } - - return session; - } - - return null; -} |