feat: add auth and dual-stack tls management

This commit is contained in:
2026-05-07 00:20:44 +08:00
parent cc19ee1936
commit fdec8960c2
24 changed files with 3005 additions and 312 deletions
+20 -14
View File
@@ -1,3 +1,5 @@
import { redirectToLogin } from './auth-client.js';
export function escapeHtml(value) {
return String(value)
.replaceAll('&', '&')
@@ -34,6 +36,10 @@ export async function fetchJson(url, options = {}) {
const payload = await response.json().catch(() => ({}));
if (!response.ok) {
if (response.status === 401 && window.location.pathname !== '/login.html') {
redirectToLogin();
}
throw new Error(`${payload.error?.code ?? 'REQUEST_FAILED'}: ${payload.error?.message ?? 'Request failed.'}`);
}
@@ -81,15 +87,15 @@ export function linkToFile(sourceId, fileId) {
export function inferEnhancementLabel(source) {
switch (source?.enhancement?.status) {
case 'ready':
return '已增强';
return 'Enhanced';
case 'running':
return '增强中';
return 'Running';
case 'queued':
return '排队中';
return 'Queued';
case 'failed':
return '增强失败';
return 'Failed';
default:
return '未增强';
return 'Not ready';
}
}
@@ -110,7 +116,7 @@ export function inferEnhancementClass(source) {
export function renderSourceSummaryCard(source, extraActionsHtml = '') {
const title = escapeHtml(source.displayName || source.originalFilename);
const originalFilename = escapeHtml(source.originalFilename);
const matchedHint = source.matchedBackupName ? '任务名来自 Server DB' : '未匹配任务名';
const matchedHint = source.matchedBackupName ? 'Task name resolved from Server DB' : 'Task name not mapped yet';
const progress =
source.enhancement.totalVolumes > 0
? `${source.enhancement.processedVolumes}/${source.enhancement.totalVolumes}`
@@ -121,8 +127,8 @@ export function renderSourceSummaryCard(source, extraActionsHtml = '') {
<div class="source-main">
<div>
<p class="source-name">${title}</p>
<p class="source-meta">原始库名: ${originalFilename}</p>
<p class="source-meta">sourceId: ${escapeHtml(source.id)}</p>
<p class="source-meta">Database file: ${originalFilename}</p>
<p class="source-meta">Source ID: ${escapeHtml(source.id)}</p>
</div>
<span class="status-pill ${inferEnhancementClass(source)}">${inferEnhancementLabel(source)}</span>
</div>
@@ -131,19 +137,19 @@ export function renderSourceSummaryCard(source, extraActionsHtml = '') {
<div class="card-grid">
<div class="stat">
<span>上传大小</span>
<span>Uploaded size</span>
<strong>${formatBytes(source.fileSize)}</strong>
</div>
<div class="stat">
<span>最近快照</span>
<strong>${escapeHtml(source.latestSnapshot?.timestamp ?? '无快照')}</strong>
<span>Latest snapshot</span>
<strong>${escapeHtml(source.latestSnapshot?.timestamp ?? 'None')}</strong>
</div>
<div class="stat">
<span>目录浏览</span>
<strong>${source.canBrowse ? '可用' : '不可用'}</strong>
<span>Browse</span>
<strong>${source.canBrowse ? 'Available' : 'Unavailable'}</strong>
</div>
<div class="stat">
<span>增强进度</span>
<span>Enhancement</span>
<strong>${escapeHtml(progress)}</strong>
</div>
</div>