Files
2026-07-27 19:31:43 +08:00

74 lines
1.2 KiB
Go

package upload
import (
"crypto/rand"
"encoding/hex"
"sort"
"time"
)
func (m *Manager) patch(taskID string, fn func(*taskState)) {
m.mu.Lock()
st, ok := m.tasks[taskID]
if !ok {
m.mu.Unlock()
return
}
fn(st)
st.UpdatedAt = unixFloat(time.Now())
snap := st
m.mu.Unlock()
m.persistTask(snap)
m.broadcast()
}
func (m *Manager) failTask(taskID, errMsg string) {
m.patch(taskID, func(st *taskState) {
st.Status = StatusFailed
st.SpeedBytesPerSecond = 0
st.Message = "上传失败"
st.Error = translateError(errMsg)
})
}
func (m *Manager) snapshot(st *taskState) *Task {
t := st.Task
return &t
}
func (m *Manager) popTask(taskID string) *taskState {
m.mu.Lock()
st, ok := m.tasks[taskID]
if !ok {
m.mu.Unlock()
return nil
}
cancel := st.cancel
if cancel != nil {
st.cancelMode = "delete"
}
delete(m.tasks, taskID)
m.mu.Unlock()
m.deletePersisted(taskID)
if cancel != nil {
cancel()
select {
case <-st.runDone:
case <-time.After(30 * time.Second):
}
}
return st
}
func newTaskID() string {
var b [8]byte
_, _ = rand.Read(b[:])
return hex.EncodeToString(b[:])
}
func sortTasksDesc(tasks []Task) {
sort.Slice(tasks, func(i, j int) bool {
return tasks[i].CreatedAt > tasks[j].CreatedAt
})
}