libertaria-stack/l0-transport/opq/manager.zig

66 lines
2.0 KiB
Zig

//! RFC-0020: OPQ (Offline Packet Queue) - Manager
//!
//! Orchestrates the flow of frames into the store, enforcing quotas and TTLs.
const std = @import("std");
const store = @import("store.zig");
const quota = @import("quota.zig");
const lwf = @import("lwf");
pub const OPQManager = struct {
allocator: std.mem.Allocator,
policy: quota.Policy,
store: store.WALStore,
pub fn init(allocator: std.mem.Allocator, base_dir: []const u8, persona: quota.Persona) !OPQManager {
const policy = quota.Policy.init(persona);
const wal = try store.WALStore.init(allocator, base_dir, policy.segment_size);
return OPQManager{
.allocator = allocator,
.policy = policy,
.store = wal,
};
}
pub fn deinit(self: *OPQManager) void {
self.store.deinit();
}
/// Ingest a frame into the queue
pub fn ingestFrame(self: *OPQManager, frame: *const lwf.LWFFrame) !void {
// 1. Append to WAL
try self.store.appendFrame(frame);
// 2. Periodic maintenance (could be on a timer, but here we do it after ingest)
try self.maintenance();
}
pub fn maintenance(self: *OPQManager) !void {
// 1. Prune by TTL
_ = try self.store.prune(self.policy.max_retention_seconds);
// 2. Prune by Size Quota
_ = try self.store.pruneToSize(self.policy.max_storage_bytes);
}
};
test "OPQ Manager: Policy Enforcement" {
const allocator = std.testing.allocator;
const test_dir = "test_opq_manager";
std.fs.cwd().deleteTree(test_dir) catch {};
defer std.fs.cwd().deleteTree(test_dir) catch {};
// 1. Client Policy: 5MB limit, 1hr TTL
var manager = try OPQManager.init(allocator, test_dir, .client);
defer manager.deinit();
try std.testing.expectEqual(manager.policy.max_storage_bytes, 5 * 1024 * 1024);
// 2. Ingest Sample Frame
var frame = try lwf.LWFFrame.init(allocator, 10);
defer frame.deinit(allocator);
try manager.ingestFrame(&frame);
}