@@ -144,44 +144,54 @@ defmodule DiffWeb.DiffLiveView do
144144 def handle_info ( { :generate_diff , package , from , to } , socket ) do
145145 hex_impl = Application . get_env ( :diff , :hex_impl , Diff.Hex )
146146
147- try do
148- case hex_impl . diff ( package , from , to ) do
149- { :ok , stream } ->
150- case process_stream_to_diffs ( package , from , to , stream ) do
151- { :ok , metadata , diff_ids } ->
152- initial_batch_size = 5
153- { initial_diffs , _remaining } = Enum . split ( diff_ids , initial_batch_size )
154-
155- socket =
156- socket
157- |> assign (
158- metadata: metadata ,
159- all_diff_ids: diff_ids ,
160- loaded_diffs: [ ] ,
161- loaded_diff_content: % { } ,
162- remaining_diffs: diff_ids ,
163- generating: false ,
164- has_more_diffs: length ( diff_ids ) > 0
165- )
166-
167- send ( self ( ) , { :load_diffs , initial_diffs } )
168-
169- { :noreply , socket }
170-
171- { :error , reason } ->
172- Logger . error ( "Failed to generate diff: #{ inspect ( reason ) } " )
173- { :noreply , assign ( socket , error: "Failed to generate diff" , generating: false ) }
174- end
175-
176- :error ->
177- { :noreply , assign ( socket , error: "Failed to generate diff" , generating: false ) }
147+ task =
148+ Task.Supervisor . async ( Diff.Tasks , fn ->
149+ case hex_impl . diff ( package , from , to ) do
150+ { :ok , stream } ->
151+ process_stream_to_diffs ( package , from , to , stream )
152+
153+ :error ->
154+ :error
155+ end
156+ end )
157+
158+ result =
159+ case Task . yield ( task , :timer . seconds ( 60 ) ) || Task . shutdown ( task ) do
160+ { :ok , result } -> result
161+ nil -> :error
178162 end
179- catch
180- :throw , { :diff , :invalid_diff } ->
181- { :noreply , assign ( socket , error: "Invalid diff" , generating: false ) }
182- after
183- Diff.TmpDir . cleanup ( )
163+
164+ case result do
165+ { :ok , metadata , diff_ids } ->
166+ initial_batch_size = 5
167+ { initial_diffs , _remaining } = Enum . split ( diff_ids , initial_batch_size )
168+
169+ socket =
170+ socket
171+ |> assign (
172+ metadata: metadata ,
173+ all_diff_ids: diff_ids ,
174+ loaded_diffs: [ ] ,
175+ loaded_diff_content: % { } ,
176+ remaining_diffs: diff_ids ,
177+ generating: false ,
178+ has_more_diffs: length ( diff_ids ) > 0
179+ )
180+
181+ send ( self ( ) , { :load_diffs , initial_diffs } )
182+
183+ { :noreply , socket }
184+
185+ { :error , reason } ->
186+ Logger . error ( "Failed to generate diff: #{ inspect ( reason ) } " )
187+ { :noreply , assign ( socket , error: "Failed to generate diff" , generating: false ) }
188+
189+ :error ->
190+ { :noreply , assign ( socket , error: "Failed to generate diff" , generating: false ) }
184191 end
192+ catch
193+ :throw , { :diff , :invalid_diff } ->
194+ { :noreply , assign ( socket , error: "Invalid diff" , generating: false ) }
185195 end
186196
187197 def handle_info ( { :load_diffs_and_update , diff_ids } , socket ) do
0 commit comments