const minisrv_service_file = true; if (!minisrv_config.services['pnm']) { throw ("ERROR: pnm service not defined in config!"); } const pnmVaults = []; // Check pnm service vault for .ra and .rm files if (minisrv_config.config.ServiceVaults) { Object.keys(minisrv_config.config.ServiceVaults).forEach(function (k) { const service_vault = wtvshared.getAbsolutePath(minisrv_config.config.ServiceVaults[k]); pnmVaults.push(service_vault + "/pnm"); }) } else { throw ("ERROR: No Service Vaults defined!"); } const url_path = request_headers.request_url.split('?')[0]; const pathParts = url_path.split('/').filter(p => p); const serviceName = pathParts.length > 0 ? pathParts[0] : ''; const remainingPath = '/' + pathParts.slice(1).join('/'); const filename = remainingPath.split('/').pop().replace('.ram', ''); const directory = remainingPath.endsWith('/') || !filename ? remainingPath.replace(/\/$/, '') : remainingPath.substring(0, remainingPath.lastIndexOf('/')); let fileFound = false; const extensions = ['.ra', '.rm']; let resolvedPath = null; // Check if request is for a directory listing (no filename or ends with /) if (!filename || (request_headers.request_url.endsWith('/') && minisrv_config.services['pnm'].allow_indexing !== false)) { const listingDir = filename ? directory : directory || '/'; const allFiles = []; for (const pnmVault of pnmVaults) { const targetDir = path.join(pnmVault, listingDir); console.log("DEBUG: Listing files in", targetDir); if (fs.existsSync(targetDir) && fs.statSync(targetDir).isDirectory()) { const files = fs.readdirSync(targetDir); files.forEach(file => { const fullPath = path.join(targetDir, file); if (fs.statSync(fullPath).isFile() && (file.endsWith('.ra') || file.endsWith('.rm'))) { const baseFileName = file.substring(0, file.lastIndexOf('.')); allFiles.push(baseFileName + '.ram'); } }); } } if (allFiles.length > 0) { headers = `200 OK Content-type: text/html`; data = `