Updating values in loop and generate Puppeteer Pdf in loop without timeout error

Hi,

I have a list, where I have to generate a pdf for each value in the list and keep track of which pdf is getting generated to display on UI (using socket assign).

I have two issues:

  • It’s working fine for some time but after some time page is reloading and giving this error
    received timeout while communicating with server. Falling back to hard refresh for recovery
    while pdfs are getting generated in the background.
    It works fine when I remove PuppeteerPdf.Generate code

  • I am unable to update the value (current_pdf) in the loop.

     for x <- results.fetch_data do
      handle_single_item(x,socket)
      end
 def handle_single_item(value,socket)do
       // fetch_kyc is another async fn.
          result= Task.async(fn ->fetch_kyc(value,socket) end)
          awaited_result = Task.await(result, :infinity)

         //print_pdf fn is to generate pdfs

           pdf_result = Task.async(fn -> print_pdf(socket, awaited_result) end )
          Task.await(pdf_result, :infinity)  
          {: ok, socket}
 end
def print_pdf(socket,result)do
    html = Task.async(fn -> Phoenix.View.render_to_string(
    CrmUpdatedWeb.HomeView,
    "template.html", formdata: result,  socket:  socket
    ) end)
    awaited_html = Task.await(html, :infinity)
    name = :rand.uniform(256)
    socket= assign(socket, :current_pdf, name)
    // Using PuppeteerPdf to generate pdf
    result=  PuppeteerPdf.Generate.from_string(awaited_html, "../RANDOM#{name}.pdf", [print_background: true,
      timeout: 20000
    ] )
     {: no reply, socket}
   end

Thanks.

You don’t want to block LV callbacks with long running stuff. Push all that to be handled async. Given you’re already using Tasks that should mostly be a matter of not awaiting them inline, but waiting for their result messages: Task — Elixir v1.14.2.

What are you doing with the PDF’s that are generated? Sending them to the browser or to disk?
I have setup something similar last week. Although I did it by adding an iframe to the page and settings its src to a regular controller action that generates the PDF. That controller action while it is generating uses PubSub to report progress to the page, once the generation is complete the zip-file with all pdfs is downloaded by the browser.

1 Like