this repo has no description

๐Ÿงน Add job to cleanup full buckets

+47 -39
+11 -4
src/glimit/registry.gleam
··· 4 4 import gleam/dict.{type Dict} 5 5 import gleam/erlang/process.{type Subject} 6 6 import gleam/list 7 + import gleam/option.{type Option, None, Some} 7 8 import gleam/otp/actor 8 9 import gleam/otp/task 9 10 import gleam/result ··· 116 117 |> result.nil_error, 117 118 ) 118 119 119 - task.async(fn() { sweep_loop(registry, 10) }) 120 + task.async(fn() { sweep(registry, Some(10)) }) 120 121 121 122 Ok(registry) 122 123 } ··· 159 160 /// 160 161 /// This function is repeated periodically. 161 162 /// 162 - fn sweep_loop(registry: RateLimiterRegistryActor(id), interval_secs: Int) { 163 - process.sleep(interval_secs * 1000) 163 + pub fn sweep(registry: RateLimiterRegistryActor(id), interval_secs: Option(Int)) { 164 + case interval_secs { 165 + Some(i) -> process.sleep(i * 1000) 166 + None -> Nil 167 + } 164 168 165 169 get_all(registry) 166 170 |> list.filter(fn(pair) { ··· 175 179 identifier 176 180 }) 177 181 178 - sweep_loop(registry, interval_secs) 182 + case interval_secs { 183 + Some(_) -> sweep(registry, interval_secs) 184 + None -> Nil 185 + } 179 186 }
+36 -35
test/glimit_registry_test.gleam
··· 1 + import gleam/option.{None} 1 2 import gleeunit/should 2 3 import glimit/rate_limiter 3 4 import glimit/registry ··· 31 32 rate_limiter 32 33 |> should.not_equal(same_rate_limiter) 33 34 } 34 - // TODO: refactor 35 - //pub fn sweep_full_bucket_test() { 36 - // let registry = case registry.new(2, 2) { 37 - // Ok(registry) -> registry 38 - // Error(_) -> { 39 - // panic as "Should be able to create a new registry" 40 - // } 41 - // } 42 - // 43 - // let assert Ok(rate_limiter) = registry |> registry.get_or_create("๐Ÿš€") 44 - // registry |> registry.sweep 45 - // let assert Ok(new_rate_limiter) = registry |> registry.get_or_create("๐Ÿš€") 46 - // 47 - // rate_limiter 48 - // |> should.not_equal(new_rate_limiter) 49 - //} 50 - // 51 - //pub fn sweep_not_full_bucket_test() { 52 - // let registry = case registry.new(2, 2) { 53 - // Ok(registry) -> registry 54 - // Error(_) -> { 55 - // panic as "Should be able to create a new registry" 56 - // } 57 - // } 58 - // 59 - // let assert Ok(rate_limiter) = registry |> registry.get_or_create("๐Ÿš€") 60 - // 61 - // let _ = rate_limiter |> rate_limiter.hit 62 - // registry |> registry.sweep 63 - // 64 - // let assert Ok(new_rate_limiter) = registry |> registry.get_or_create("๐Ÿš€") 65 - // 66 - // rate_limiter 67 - // |> should.equal(new_rate_limiter) 68 - //} 35 + 36 + pub fn sweep_full_bucket_test() { 37 + let registry = case registry.new(2, 2) { 38 + Ok(registry) -> registry 39 + Error(_) -> { 40 + panic as "Should be able to create a new registry" 41 + } 42 + } 43 + 44 + let assert Ok(rate_limiter) = registry |> registry.get_or_create("๐Ÿš€") 45 + registry |> registry.sweep(None) 46 + let assert Ok(new_rate_limiter) = registry |> registry.get_or_create("๐Ÿš€") 47 + 48 + rate_limiter 49 + |> should.not_equal(new_rate_limiter) 50 + } 51 + 52 + pub fn sweep_not_full_bucket_test() { 53 + let registry = case registry.new(2, 2) { 54 + Ok(registry) -> registry 55 + Error(_) -> { 56 + panic as "Should be able to create a new registry" 57 + } 58 + } 59 + 60 + let assert Ok(rate_limiter) = registry |> registry.get_or_create("๐Ÿš€") 61 + 62 + let _ = rate_limiter |> rate_limiter.hit 63 + registry |> registry.sweep(None) 64 + 65 + let assert Ok(new_rate_limiter) = registry |> registry.get_or_create("๐Ÿš€") 66 + 67 + rate_limiter 68 + |> should.equal(new_rate_limiter) 69 + }