@@ -175,6 +175,17 @@ defmodule Boombox.Server do
175175 GenServer . call ( server , :produce_packet )
176176 end
177177
178+ @ doc """
179+ Informs Boombox that no more packets will be read and shouldn't be produced.
180+ Can be called only when Boombox is in `:producing` mode.
181+ """
182+ @ spec finish_producing ( t ( ) ) ::
183+ { :finished , serialized_boombox_packet ( ) | Boombox.Packet . t ( ) }
184+ | { :error , :incompatible_mode }
185+ def finish_producing ( server ) do
186+ GenServer . call ( server , :finish_producing )
187+ end
188+
178189 @ impl true
179190 def init ( opts ) do
180191 { :ok ,
@@ -390,6 +401,25 @@ defmodule Boombox.Server do
390401 { { :error , :incompatible_mode } , state }
391402 end
392403
404+ @ spec handle_request ( :finish_producing , State . t ( ) ) ::
405+ { { :finished , serialized_boombox_packet ( ) | Boombox.Packet . t ( ) }
406+ | { :error , :incompatible_mode } , State . t ( ) }
407+ defp handle_request (
408+ :finish_producing ,
409+ % State { boombox_mode: :producing , boombox_pid: boombox_pid } = state
410+ ) do
411+ send ( boombox_pid , :finish_producing )
412+
413+ receive do
414+ { :finished , packet , ^ boombox_pid } ->
415+ { { :finished , packet } , state }
416+ end
417+ end
418+
419+ defp handle_request ( :finish_producing , % State { boombox_mode: _other_mode } = state ) do
420+ { { :error , :incompatible_mode } , state }
421+ end
422+
393423 @ spec handle_request ( term ( ) , State . t ( ) ) :: { { :error , :invalid_request } , State . t ( ) }
394424 defp handle_request ( _invalid_request , state ) do
395425 { { :error , :invalid_request } , state }
0 commit comments