diff --git a/server/AyaNova/biz/ReportBiz.cs b/server/AyaNova/biz/ReportBiz.cs index f3b8f0e7..b9b43b7c 100644 --- a/server/AyaNova/biz/ReportBiz.cs +++ b/server/AyaNova/biz/ReportBiz.cs @@ -10,6 +10,7 @@ using AyaNova.Models; using EnumsNET; using PuppeteerSharp; using Newtonsoft.Json.Linq; +using System.Threading; namespace AyaNova.Biz { @@ -374,6 +375,7 @@ namespace AyaNova.Biz await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision); } + //https://stackoverflow.com/questions/53367966/puppeteer-sharp-still-appear-many-chromium-instance-in-process-task-manager-when log.LogDebug($"Launching headless Chrome now:"); using (var browser = await Puppeteer.LaunchAsync(lo)) @@ -381,6 +383,8 @@ namespace AyaNova.Biz { try { + + log.LogDebug($"Preparing page: adding base reporting scripts to page"); //Add Handlebars JS for compiling and presenting @@ -470,11 +474,21 @@ namespace AyaNova.Biz //prePareData / preRender var ReportDataObject = $"{{ ayReportData:{ReportData}, ayReportMetaData:{reportMeta}, ayClientMetaData:{clientMeta}, ayServerMetaData:{serverMeta} }}"; log.LogDebug($"Calling ayPreRender..."); - var PreParedReportDataObject = await page.EvaluateExpressionAsync($"ayPreRender({ReportDataObject});");//note ayPreRender is async but dont' use await to call it as the EvaluateExpressionAsync function knows how to handle that already + + //PRE-RENDER ORIGINAL WAY + // var PreParedReportDataObject = await page.EvaluateExpressionAsync($"ayPreRender({ReportDataObject});");//note ayPreRender is async but dont' use await to call it as the EvaluateExpressionAsync function knows how to handle that already + + //PRE_RENDER WITH TIMEOUT + var w = new WaitForFunctionOptions() { Timeout = 10000 }; + //var test = await page.WaitForExpressionAsync($"aytest()==true", w); + // var PreParedReportDataObject = await page.WaitForExpressionAsync($"ayPreRender({ReportDataObject})!=null", w); + + //new style, nothing to return, keeps data on page + await page.WaitForExpressionAsync($"ayPreRenderEx({ReportDataObject})", w); //compile the template log.LogDebug($"Calling Handlebars.compile..."); - var compileScript = $"Handlebars.compile(`{report.Template}`)({PreParedReportDataObject});"; + var compileScript = $"Handlebars.compile(`{report.Template}`)(PreParedReportDataObject);"; var compiledHTML = await page.EvaluateExpressionAsync(compileScript); //render report as HTML diff --git a/server/AyaNova/resource/rpt/ay-report.js b/server/AyaNova/resource/rpt/ay-report.js index f322c995..8a5d710c 100644 --- a/server/AyaNova/resource/rpt/ay-report.js +++ b/server/AyaNova/resource/rpt/ay-report.js @@ -9,6 +9,19 @@ async function ayPreRender(ayAllData) { } } +let PreParedReportDataObject = null; +let DataReady=false; + +async function ayPreRenderEx(ayAllData) { + if (typeof ayPrepareData === "function") { + PreParedReportDataObject = await ayPrepareData(ayAllData); + } else { + PreParedReportDataObject = ayAllData; + } + DataReady=true; + return true; +} + /////////////////////////////////////// // Set our stock handlebars helpers // @@ -38,7 +51,7 @@ function ayRegisterHelpers() { }); Handlebars.registerHelper("ayWiki", function (ayValue) { - if(ayValue==null){ + if (ayValue == null) { return ""; } return new Handlebars.SafeString(