@@ -174,7 +174,7 @@ defmodule Markdoc.DocServer do
174174 @ impl true
175175 def handle_cast ( { :leave , channel_pid } , state ) do
176176 new_users = MapSet . delete ( state . users , channel_pid )
177- new_state = % { state | users: new_users }
177+ base_state = % { state | users: new_users , idle_flush_timer: cancel_timer ( state . idle_flush_timer ) }
178178
179179 Logger . debug ( "User left document" ,
180180 event: :user_left ,
@@ -185,14 +185,17 @@ defmodule Markdoc.DocServer do
185185 # Start cleanup timer if no users remain
186186 new_state =
187187 if MapSet . size ( new_users ) == 0 do
188+ flushed_state = maybe_flush ( base_state , :idle_flush )
188189 timer_ref = Process . send_after ( self ( ) , :cleanup_timeout , @ cleanup_timeout )
190+
189191 Logger . info ( "Document is now idle" ,
190192 event: :document_idle ,
191193 cleanup_timeout_ms: @ cleanup_timeout
192194 )
193- % { new_state | cleanup_timer: timer_ref }
195+
196+ % { flushed_state | cleanup_timer: timer_ref }
194197 else
195- new_state
198+ base_state
196199 end
197200
198201 { :noreply , new_state }
@@ -325,12 +328,16 @@ defmodule Markdoc.DocServer do
325328 # Start cleanup timer if no users remain
326329 new_state =
327330 if MapSet . size ( new_users ) == 0 do
331+ base_state = % { state | users: new_users , idle_flush_timer: cancel_timer ( state . idle_flush_timer ) }
332+ flushed_state = maybe_flush ( base_state , :idle_flush )
328333 timer_ref = Process . send_after ( self ( ) , :cleanup_timeout , @ cleanup_timeout )
334+
329335 Logger . info ( "Document is now idle" ,
330336 event: :document_idle ,
331337 cleanup_timeout_ms: @ cleanup_timeout
332338 )
333- % { state | users: new_users , cleanup_timer: timer_ref }
339+
340+ % { flushed_state | cleanup_timer: timer_ref }
334341 else
335342 % { state | users: new_users }
336343 end
@@ -400,6 +407,12 @@ defmodule Markdoc.DocServer do
400407 Process . send_after ( self ( ) , :idle_flush , Markdoc.Storage . idle_flush_ms ( ) )
401408 end
402409
410+ defp cancel_timer ( nil ) , do: nil
411+ defp cancel_timer ( ref ) do
412+ Process . cancel_timer ( ref )
413+ nil
414+ end
415+
403416 defp trigger_snapshot_request ( users , doc_id ) do
404417 case users |> MapSet . to_list ( ) |> Enum . take_random ( 1 ) do
405418 [ pid ] ->
0 commit comments