fix: 改进 SSE 克隆处理,仓库页面添加调试信息

This commit is contained in:
2026-06-18 23:04:58 +08:00
parent 34ef868e10
commit 4f873cf2ce
3 changed files with 195 additions and 85 deletions
+45 -6
View File
@@ -78,41 +78,80 @@ document.getElementById('clone-form').addEventListener('submit', async function(
const bar = document.getElementById('clone-bar');
const errorEl = document.getElementById('clone-error');
btn.disabled = true;
btn.textContent = '克隆中...';
progress.classList.remove('hidden');
errorEl.classList.add('hidden');
bar.style.width = '0%';
status.textContent = '正在连接...';
try {
const resp = await fetch('/api/repos', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({url: url})
});
if (!resp.ok) { const data = await resp.json(); throw new Error(data.error || 'clone failed'); }
if (!resp.ok) {
const data = await resp.json();
throw new Error(data.error || 'clone failed');
}
const reader = resp.body.getReader();
const decoder = new TextDecoder();
let buffer = '';
let currentEvent = '';
while (true) {
const {done, value} = await reader.read();
if (done) break;
buffer += decoder.decode(value, {stream: true});
const lines = buffer.split('\n');
buffer = lines.pop() || '';
for (const line of lines) {
if (line.startsWith('data: ')) {
if (line.startsWith('event: ')) {
currentEvent = line.slice(7).trim();
} else if (line.startsWith('data: ')) {
try {
const data = JSON.parse(line.slice(6));
if (data.progress !== undefined) bar.style.width = data.progress + '%';
if (data.message) status.textContent = data.message;
if (data.done) { window.location.href = '/repo/' + data.repo_id; return; }
} catch {}
if (currentEvent === 'start') {
status.textContent = '开始克隆...';
bar.style.width = '10%';
} else if (currentEvent === 'progress') {
status.textContent = data.step || '处理中...';
if (data.current !== undefined && data.total > 0) {
bar.style.width = Math.round((data.current / data.total) * 80 + 10) + '%';
} else {
bar.style.width = '50%';
}
} else if (currentEvent === 'complete') {
bar.style.width = '100%';
status.textContent = '克隆完成!';
// Redirect to repo page
setTimeout(() => {
window.location.href = '/repo/' + data.repo_id;
}, 500);
return;
} else if (currentEvent === 'error') {
throw new Error(data.message || '克隆失败');
}
} catch (parseErr) {
if (parseErr.message && !parseErr.message.includes('JSON')) {
throw parseErr;
}
}
}
}
}
} catch (err) {
errorEl.textContent = err.message;
errorEl.classList.remove('hidden');
progress.classList.add('hidden');
} finally {
btn.disabled = false;
btn.textContent = '克隆';
}
});
</script>