Skip to content

Commit e21d086

Browse files
committed
feat: add retries to screenshot queue tasks
1 parent d9776ce commit e21d086

File tree

1 file changed

+33
-15
lines changed

1 file changed

+33
-15
lines changed

lib/algora/screenshot_queue.ex

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)