// This file contains function that are web app specific let webRunDiagnostics = []; function openWebRunDetails() { let dialog = document.getElementById("runDetailsDialog"); if (dialog && !dialog.open) { dialog.showModal(); } } function recordWebDiagnostic(filename, request, response) { let timestamp = new Date().toLocaleTimeString(); let entry = `[${timestamp}] ${filename}\nHTTP ${request.status} ${request.statusText || ""}`; if (response) { entry += `\nPhase: ${response.phase || "unknown"}`; entry += `\nStatus: ${response.ok ? "successful" : "failed"}`; if (response.exitCode !== null && response.exitCode !== undefined) { entry += `\nBinary exit code: ${response.exitCode}`; } if (response.message) { entry += `\nCGI: ${response.message}`; } if (response.log) { entry += `\n\n${response.log.trim()}`; } } else if (request.responseText) { entry += `\n\n${request.responseText.trim()}`; } webRunDiagnostics.push(entry); let log = document.getElementById("webRunLog"); if (log) { log.textContent = webRunDiagnostics.join("\n\n----------------------------------------\n\n"); log.scrollTop = log.scrollHeight; } } function writeAsciiFile(filename,content) { // Write string content into ascii file filename // Go via CGI script //console.log(filename, content); // Prepare CGI args use POST for long files let cgiargs = new URLSearchParams(); cgiargs.set("fn", filename); // Forward the GUI-selected RNG backend to the CGI wrapper, which passes it // to the TRIM.SP-NL engine as the optional second command-line argument. let rngType = document.getElementById("rngType"); if (rngType) { cgiargs.set("rngType", rngType.value); } let lines = content.split(/\n/); let prefix = filename.split(/\//); for (let i=0; i= 300 || !response || !response.ok) { updateStatusBar({ run: `Web backend failed for ${prefix[prefix.length - 1]}` }); return(0); } if (response.archiveUrl) { let outputLink = document.getElementById("statusOutputLink"); outputLink.href = response.archiveUrl; outputLink.textContent = "Outputs"; outputLink.title = `Download ${prefix[2]}.tgz`; outputLink.hidden = false; } return(1); } function readAsciiFile(filename) { // Read server-side simulation output through the CGI. Files remain in // filesystem /tmp and do not need to be exposed directly by Apache. if (filename == "" || filename == undefined || filename == null) { return 0; } let request = "/cgi-bin/singleTrimSP.cgi?action=read&fn=" + encodeURIComponent(filename) + "&_=" + Date.now(); let xhttp = new XMLHttpRequest(); xhttp.open("GET", request, false); xhttp.overrideMimeType("text/plain"); xhttp.send(); if (xhttp.status < 200 || xhttp.status >= 300) { recordWebDiagnostic(filename, xhttp, { ok: false, phase: "read", message: `Could not read simulation output (HTTP ${xhttp.status}).`, }); updateStatusBar({ run: `Could not read ${filename.split("/").pop()}` }); throw new Error(`Could not read ${filename}: HTTP ${xhttp.status} ${xhttp.statusText}`); } return(xhttp.responseText); }