@@ -37,13 +37,13 @@ defmodule Lightning.WebhookRateLimiter do
37
37
capacity = Keyword . fetch! ( opts , :capacity )
38
38
refill = Keyword . fetch! ( opts , :refill_per_second )
39
39
40
- { :ok , % { table: :ets . new ( :table , [ :set ] ) , capacity: capacity , refill : refill } }
40
+ { :ok , % { table: :ets . new ( :table , [ :set ] ) , capacity: capacity , refill_per_second : refill } }
41
41
end
42
42
43
- def check_rate ( bucket , cost \\ 1 , name \\ __MODULE__ ) do
43
+ def check_rate ( bucket , capacity \\ nil , refill \\ nil , name \\ __MODULE__ ) do
44
44
name
45
45
|> via_tuple ( )
46
- |> GenServer . call ( { :check_rate , bucket , cost } )
46
+ |> GenServer . call ( { :check_rate , bucket , capacity , refill } )
47
47
end
48
48
49
49
def inspect_table ( name \\ __MODULE__ ) do
@@ -53,8 +53,8 @@ defmodule Lightning.WebhookRateLimiter do
53
53
end
54
54
55
55
@ impl true
56
- def handle_call ( { :check_rate , bucket , cost } , _from , state ) do
57
- { :reply , do_check_rate ( state , bucket , cost ) , state }
56
+ def handle_call ( { :check_rate , bucket , capacity , refill } , _from , state ) do
57
+ { :reply , do_check_rate ( state , bucket , capacity , refill ) , state }
58
58
end
59
59
60
60
@ impl true
@@ -74,21 +74,19 @@ defmodule Lightning.WebhookRateLimiter do
74
74
{ :stop , :normal , state }
75
75
end
76
76
77
- def do_check_rate (
78
- % { table: table , capacity: capacity , refill: refill_per_sec } ,
79
- bucket ,
80
- cost
81
- ) do
77
+ def do_check_rate ( % { table: table } = config , bucket , capacity , refill_per_sec ) do
82
78
now = System . monotonic_time ( :millisecond )
79
+ capacity = capacity || config [ :capacity ]
80
+ refill_per_sec = refill_per_sec || config [ :refill_per_second ]
83
81
84
82
:ets . insert_new ( table , { bucket , { capacity , now } } )
85
83
[ { ^ bucket , { level , updated } } ] = :ets . lookup ( table , bucket )
86
84
87
85
refilled = div ( now - updated , 1_000 ) * refill_per_sec
88
86
current = min ( capacity , level + refilled )
89
87
90
- if current >= cost do
91
- level = current - cost
88
+ if current >= 1 do
89
+ level = current - 1
92
90
:ets . insert ( table , { bucket , { level , now } } )
93
91
94
92
{ :allow , level }
0 commit comments