From faadd4f68c014ad1b974c933496f22036e63ba71 Mon Sep 17 00:00:00 2001
From: pablo
Date: Tue, 12 Aug 2025 12:29:57 +0300
Subject: [PATCH] fix: async store
---
ratelimit/store.nim | 4 ++--
tests/test_ratelimit_manager.nim | 12 ++++++------
tests/test_store.nim | 18 +++++++++---------
3 files changed, 17 insertions(+), 17 deletions(-)
diff --git a/ratelimit/store.nim b/ratelimit/store.nim
index 3c023aa..262bd41 100644
--- a/ratelimit/store.nim
+++ b/ratelimit/store.nim
@@ -11,7 +11,7 @@ type
normalLength: int
nextBatchId: int
- BucketState* = object
+ BucketState* {.pure} = object
budget*: int
budgetCap*: int
lastTimeFull*: Moment
@@ -22,7 +22,7 @@ type
const BUCKET_STATE_KEY = "rate_limit_bucket_state"
-proc new*[T](M: type[RateLimitStore[T]], db: DbConn): M =
+proc new*[T](M: type[RateLimitStore[T]], db: DbConn): Future[M] {.async} =
result = M(db: db, criticalLength: 0, normalLength: 0, nextBatchId: 1)
# Initialize cached lengths from database
diff --git a/tests/test_ratelimit_manager.nim b/tests/test_ratelimit_manager.nim
index 70ebe2c..50a2000 100644
--- a/tests/test_ratelimit_manager.nim
+++ b/tests/test_ratelimit_manager.nim
@@ -33,7 +33,7 @@ suite "Queue RateLimitManager":
asyncTest "sendOrEnqueue - immediate send when capacity available":
## Given
- let store: RateLimitStore[string] = RateLimitStore[string].new(db)
+ let store: RateLimitStore[string] = await RateLimitStore[string].new(db)
let manager = await RateLimitManager[string].new(
store, mockSender, capacity = 10, duration = chronos.milliseconds(100)
)
@@ -52,7 +52,7 @@ suite "Queue RateLimitManager":
asyncTest "sendOrEnqueue - multiple messages":
## Given
- let store = RateLimitStore[string].new(db)
+ let store = await RateLimitStore[string].new(db)
let manager = await RateLimitManager[string].new(
store, mockSender, capacity = 10, duration = chronos.milliseconds(100)
)
@@ -73,7 +73,7 @@ suite "Queue RateLimitManager":
asyncTest "start and stop - drop large batch":
## Given
- let store = RateLimitStore[string].new(db)
+ let store = await RateLimitStore[string].new(db)
let manager = await RateLimitManager[string].new(
store,
mockSender,
@@ -90,7 +90,7 @@ suite "Queue RateLimitManager":
asyncTest "enqueue - enqueue critical only when exceeded":
## Given
- let store = RateLimitStore[string].new(db)
+ let store = await RateLimitStore[string].new(db)
let manager = await RateLimitManager[string].new(
store,
mockSender,
@@ -134,7 +134,7 @@ suite "Queue RateLimitManager":
asyncTest "enqueue - enqueue normal on 70% capacity":
## Given
- let store = RateLimitStore[string].new(db)
+ let store = await RateLimitStore[string].new(db)
let manager = await RateLimitManager[string].new(
store,
mockSender,
@@ -179,7 +179,7 @@ suite "Queue RateLimitManager":
asyncTest "enqueue - process queued messages":
## Given
- let store = RateLimitStore[string].new(db)
+ let store = await RateLimitStore[string].new(db)
let manager = await RateLimitManager[string].new(
store,
mockSender,
diff --git a/tests/test_store.nim b/tests/test_store.nim
index b08b7d3..16cfdfe 100644
--- a/tests/test_store.nim
+++ b/tests/test_store.nim
@@ -21,7 +21,7 @@ suite "SqliteRateLimitStore Tests":
asyncTest "newSqliteRateLimitStore - empty state":
## Given
- let store = RateLimitStore[string].new(db)
+ let store = await RateLimitStore[string].new(db)
## When
let loadedState = await store.loadBucketState()
@@ -31,7 +31,7 @@ suite "SqliteRateLimitStore Tests":
asyncTest "saveBucketState and loadBucketState - state persistence":
## Given
- let store = RateLimitStore[string].new(db)
+ let store = await RateLimitStore[string].new(db)
let now = Moment.now()
echo "now: ", now.epochSeconds()
@@ -51,7 +51,7 @@ suite "SqliteRateLimitStore Tests":
asyncTest "queue operations - empty store":
## Given
- let store = RateLimitStore[string].new(db)
+ let store = await RateLimitStore[string].new(db)
## When/Then
check store.getQueueLength(QueueType.Critical) == 0
@@ -65,7 +65,7 @@ suite "SqliteRateLimitStore Tests":
asyncTest "addToQueue and popFromQueue - single batch":
## Given
- let store = RateLimitStore[string].new(db)
+ let store = await RateLimitStore[string].new(db)
let msgs = @[("msg1", "Hello"), ("msg2", "World")]
## When
@@ -92,7 +92,7 @@ suite "SqliteRateLimitStore Tests":
asyncTest "addToQueue and popFromQueue - multiple batches FIFO":
## Given
- let store = RateLimitStore[string].new(db)
+ let store = await RateLimitStore[string].new(db)
let batch1 = @[("msg1", "First")]
let batch2 = @[("msg2", "Second")]
let batch3 = @[("msg3", "Third")]
@@ -130,7 +130,7 @@ suite "SqliteRateLimitStore Tests":
asyncTest "queue isolation - critical and normal queues are separate":
## Given
- let store = RateLimitStore[string].new(db)
+ let store = await RateLimitStore[string].new(db)
let criticalMsgs = @[("crit1", "Critical Message")]
let normalMsgs = @[("norm1", "Normal Message")]
@@ -167,14 +167,14 @@ suite "SqliteRateLimitStore Tests":
let msgs = @[("persist1", "Persistent Message")]
block:
- let store1 = RateLimitStore[string].new(db)
+ let store1 = await RateLimitStore[string].new(db)
let addResult = await store1.pushToQueue(QueueType.Critical, msgs)
check addResult == true
check store1.getQueueLength(QueueType.Critical) == 1
## When - Create new store instance
block:
- let store2 = RateLimitStore[string].new(db)
+ let store2 =await RateLimitStore[string].new(db)
## Then - Queue length should be restored from database
check store2.getQueueLength(QueueType.Critical) == 1
@@ -186,7 +186,7 @@ suite "SqliteRateLimitStore Tests":
asyncTest "large batch handling":
## Given
- let store = RateLimitStore[string].new(db)
+ let store = await RateLimitStore[string].new(db)
var largeBatch: seq[tuple[msgId: string, msg: string]]
for i in 1 .. 100: