aboutsummaryrefslogtreecommitdiff
path: root/src/storage/session-manager
diff options
context:
space:
mode:
authorNathan Reiner <nathan@nathanreiner.xyz>2026-05-20 10:16:50 +0200
committerNathan Reiner <nathan@nathanreiner.xyz>2026-05-20 10:16:50 +0200
commit44445734ba4a0f05564f808c2fd34a7f23c6fafb (patch)
tree3bd22add718620cbf931286f55137bcc666100be /src/storage/session-manager
parent95ae9f15e1db335a7f8358d811ea37e2c89dd10f (diff)
Let's do a rewrite!
Created project structure and changed `build.zig` and added licence.
Diffstat (limited to 'src/storage/session-manager')
-rw-r--r--src/storage/session-manager/root.zig78
-rw-r--r--src/storage/session-manager/session.zig34
2 files changed, 0 insertions, 112 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;
-}
diff --git a/src/storage/session-manager/session.zig b/src/storage/session-manager/session.zig
deleted file mode 100644
index 943334b..0000000
--- a/src/storage/session-manager/session.zig
+++ /dev/null
@@ -1,34 +0,0 @@
-const std = @import("std");
-const User = @import("../user.zig");
-
-const Self = @This();
-
-const fingerprint_size = 512;
-
-age: std.time.Instant,
-info: User.Info,
-fingerprint: []u8,
-
-pub fn init(allocator: std.mem.Allocator, info: User.Info) !Self {
- var self: Self = undefined;
- self.info = try info.clone(allocator);
- self.fingerprint = try allocator.alloc(u8, fingerprint_size);
- try self.reset();
-
- return self;
-}
-
-pub fn reset(self: *Self) !void {
- var raw_buffer: [fingerprint_size / 2]u8 = undefined;
- std.crypto.random.bytes(&raw_buffer);
-
- var writer = std.Io.Writer.fixed(self.fingerprint);
- writer.print("{x}", .{raw_buffer}) catch unreachable;
-
- self.age = try std.time.Instant.now();
-}
-
-pub fn deinit(self: *const Self, allocator: std.mem.Allocator) void {
- self.info.deinit(allocator);
- allocator.free(self.fingerprint);
-}