Files
Henry_Du 4ce4649aaf
Build VoiceHub FPK / build-fpk (push) Failing after 56m5s
Build and Push Docker Image / build-and-push (push) Canceled after 1h9m35s
初次提交
2026-09-06 08:19:02 +08:00

151 lines
3.3 KiB
TypeScript

import { onUnmounted, ref } from 'vue'
import { useProgress } from './useProgress'
import { useAuth } from './useAuth'
export const useProgressEvents = () => {
const {
percentage,
message,
subMessage,
active,
indeterminate,
completed,
error,
start,
startIndeterminate,
update,
complete,
setError,
reset
} = useProgress()
const progressId = ref('')
let eventSource: EventSource | null = null
// 连接到进度事件流
const connect = async (id: string) => {
// 确保之前的连接已关闭
disconnect()
progressId.value = id
startIndeterminate('正在连接...')
try {
// 创建新的事件源,通过URL参数传递认证token
const auth = useAuth()
const token = auth.getToken()
eventSource = new EventSource(`/api/progress/events?id=${id}&token=${token}`)
// 连接打开
eventSource.onopen = () => {
startIndeterminate('已连接,等待进度更新...')
}
// 接收消息
eventSource.onmessage = (event) => {
try {
const data = JSON.parse(event.data)
if (data.connected) {
startIndeterminate('已连接,等待进度更新...')
return
}
if (data.error) {
setError(data.error)
disconnect()
return
}
if (data.completed) {
complete(data.message || '操作完成')
disconnect()
return
}
// 更新进度
if (data.progress !== undefined) {
// 如果之前是不确定状态,切换到确定状态
if (indeterminate.value) {
start(data.message || '处理中...')
}
update(
data.progress,
data.message !== undefined ? data.message : undefined,
data.subMessage !== undefined ? data.subMessage : undefined
)
}
} catch (err) {
console.error('处理进度事件时出错:', err)
}
}
// 错误处理
eventSource.onerror = (err) => {
console.error('进度事件流错误:', err)
setError('连接进度更新失败')
disconnect()
}
// 关闭事件
eventSource.addEventListener('close', () => {
disconnect()
})
} catch (err) {
console.error('创建EventSource时出错:', err)
setError('无法连接到进度更新服务')
}
}
// 断开连接
const disconnect = () => {
if (eventSource) {
eventSource.close()
eventSource = null
}
}
// 获取新的进度ID
const getProgressId = async () => {
try {
const response = await fetch('/api/progress/id', {
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
})
if (!response.ok) {
throw new Error('获取进度ID失败')
}
const data = await response.json()
progressId.value = data.id
return data.id
} catch (err) {
console.error('获取进度ID时出错:', err)
return null
}
}
// 清理
onUnmounted(() => {
disconnect()
})
return {
progressId,
percentage,
message,
subMessage,
active,
indeterminate,
completed,
error,
connect,
disconnect,
getProgressId
}
}