@@ -8,6 +8,7 @@ defmodule PostHog.Sender do
88 :api_client ,
99 :max_batch_time_ms ,
1010 :max_batch_events ,
11+ :timer_ref ,
1112 events: [ ] ,
1213 num_events: 0
1314 ]
@@ -74,24 +75,29 @@ defmodule PostHog.Sender do
7475 def handle_cast ( { :event , event } , state ) do
7576 case state do
7677 % { num_events: n , events: events } when n + 1 >= state . max_batch_events ->
78+ if state . timer_ref , do: Process . cancel_timer ( state . timer_ref , async: true , info: false )
79+
7780 { :noreply , % { state | events: [ event | events ] , num_events: n + 1 } ,
7881 { :continue , :send_batch } }
7982
8083 % { num_events: 0 , events: events } ->
81- Process . send_after ( self ( ) , :batch_time_reached , state . max_batch_time_ms )
84+ ref = :erlang . start_timer ( state . max_batch_time_ms , self ( ) , :batch_time_reached )
8285
83- { :noreply , % { state | events: [ event | events ] , num_events: 1 } }
86+ { :noreply , % { state | events: [ event | events ] , num_events: 1 , timer_ref: ref } }
8487
8588 % { num_events: n , events: events } ->
8689 { :noreply , % { state | events: [ event | events ] , num_events: n + 1 } }
8790 end
8891 end
8992
9093 @ impl GenServer
91- def handle_info ( :batch_time_reached , state ) do
94+ def handle_info ( { :timeout , ref , :batch_time_reached } , % { num_events: n , timer_ref: ref } = state )
95+ when n > 0 do
9296 { :noreply , state , { :continue , :send_batch } }
9397 end
9498
99+ def handle_info ( { :timeout , _ref , :batch_time_reached } , state ) , do: { :noreply , state }
100+
95101 @ impl GenServer
96102 def handle_continue ( :send_batch , state ) do
97103 # Before we initiate an HTTP request that might block the process
@@ -101,7 +107,7 @@ defmodule PostHog.Sender do
101107 Registry . update_value ( state . registry , registry_key ( state . index ) , fn _ -> :busy end )
102108 PostHog.API . batch ( state . api_client , state . events )
103109 Registry . update_value ( state . registry , registry_key ( state . index ) , fn _ -> :available end )
104- { :noreply , % { state | events: [ ] , num_events: 0 } }
110+ { :noreply , % { state | events: [ ] , num_events: 0 , timer_ref: nil } }
105111 end
106112
107113 @ impl GenServer
0 commit comments