Files
safetynet/apps/server/public/diagnostics-admin.js
T

10 lines
1.9 KiB
JavaScript

// Central diagnostics use the same draft, roles and independent publisher.
const diagnosticsFields=['diagnostics-enabled','diagnostics-mode','diagnostics-endpoint','diagnostics-sample','diagnostics-debug-sample',...['queue','flush','age','timeout'].map(key=>`diagnostics-${key}`)];
const diagnosticsLimits=[['queue','maxQueueSize',512],['flush','flushIntervalMs',2000],['age','maxRecordAgeMs',30000],['timeout','exportTimeoutMs',2000]];
function fillDiagnostics(p){const d=p.diagnostics||{};$('diagnostics-enabled').checked=d.enabled===true;$('diagnostics-mode').value=d.mode||'operational';$('diagnostics-endpoint').value=d.endpoint||'';$('diagnostics-sample').value=d.sampleRate??0.1;$('diagnostics-debug-sample').value=d.debugSampleRate??1;for(const [id,key,fallback] of diagnosticsLimits)$(`diagnostics-${id}`).value=d[key]??fallback;}
const fillBeforeDiagnostics=fill;fill=function(p){fillBeforeDiagnostics(p);fillDiagnostics(p);};
const draftBeforeDiagnostics=draft;draft=function(){const p=draftBeforeDiagnostics();p.diagnostics={...(p.diagnostics||{}),enabled:$('diagnostics-enabled').checked,mode:$('diagnostics-mode').value,endpoint:$('diagnostics-endpoint').value.trim(),sampleRate:Number($('diagnostics-sample').value),debugSampleRate:Number($('diagnostics-debug-sample').value)};for(const [id,key] of diagnosticsLimits)p.diagnostics[key]=Number($(`diagnostics-${id}`).value);if(!p.diagnostics.endpoint)delete p.diagnostics.endpoint;return p;};
const permissionsBeforeDiagnostics=applyOperatorPermissions;applyOperatorPermissions=function(principal){permissionsBeforeDiagnostics(principal);const allowed=principal.permissions?.includes('policy.write')||(independentApprovalRequired&&principal.role==='operator');for(const id of diagnosticsFields)$(id).disabled=!allowed;};
for(const id of diagnosticsFields)$(id).addEventListener('change',()=>updateDraftStatus());
if(policy)fillDiagnostics(policy);if(currentPrincipal)applyOperatorPermissions(currentPrincipal);