fix: 改进 SSE 克隆处理,仓库页面添加调试信息
This commit is contained in:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user