@@ -65,26 +65,44 @@ defmodule Algora.ScreenshotQueue do
6565 defp start_task ( url , opts , from , state ) do
6666 task =
6767 Task . async ( fn ->
68- try do
69- puppeteer_path = Path . join ( [ :code . priv_dir ( :algora ) , "puppeteer" , "puppeteer-img.js" ] )
70-
71- case System . cmd ( "node" , [ puppeteer_path ] ++ build_opts ( url , opts ) ) do
72- { _ , 127 } -> { :error , :invalid_exec_path }
73- { cmd_response , _ } -> { :ok , cmd_response }
74- end
75- rescue
76- e in ErlangError ->
77- % ErlangError { original: error } = e
78-
79- case error do
80- :enoent -> { :error , :invalid_exec_path }
81- end
82- end
68+ try_generate_image ( url , opts , 3 )
8369 end )
8470
8571 { task , % { state | active_tasks: Map . put ( state . active_tasks , task . ref , from ) } }
8672 end
8773
74+ defp try_generate_image ( url , opts , attempts_left ) when attempts_left > 0 do
75+ puppeteer_path = Path . join ( [ :code . priv_dir ( :algora ) , "puppeteer" , "puppeteer-img.js" ] )
76+
77+ case System . cmd ( "node" , [ puppeteer_path ] ++ build_opts ( url , opts ) ) do
78+ { _ , 127 } ->
79+ { :error , :invalid_exec_path }
80+
81+ { cmd_response , 0 } ->
82+ { :ok , cmd_response }
83+
84+ _ ->
85+ Logger . warning ( "Puppeteer command failed, attempts left: #{ attempts_left - 1 } " )
86+ try_generate_image ( url , opts , attempts_left - 1 )
87+ end
88+ rescue
89+ e in ErlangError ->
90+ % ErlangError { original: error } = e
91+
92+ case error do
93+ :enoent ->
94+ { :error , :invalid_exec_path }
95+
96+ _ ->
97+ Logger . warning ( "Puppeteer command failed with #{ inspect ( error ) } , attempts left: #{ attempts_left - 1 } " )
98+ try_generate_image ( url , opts , attempts_left - 1 )
99+ end
100+ end
101+
102+ defp try_generate_image ( _url , _opts , 0 ) do
103+ { :error , :max_retries_exceeded }
104+ end
105+
88106 defp build_opts ( url , options ) do
89107 options
90108 |> Keyword . take ( [ :type , :path , :width , :height , :scale_factor ] )
0 commit comments