progress_cache.go
⎇
Raw
1package service
2
3import (
4 "strings"
5 "sync"
6 "time"
7)
8
9type LiveDownload struct {
10 Logs strings.Builder
11 LastUpdate time.Time
12}
13
14type ProgressCache struct {
15 mu sync.RWMutex
16 data map[int64]*LiveDownload
17}
18
19func NewProgressCache() *ProgressCache {
20 return &ProgressCache{
21 data: make(map[int64]*LiveDownload),
22 }
23}
24
25func (c *ProgressCache) Set(id int64, d *LiveDownload) {
26 c.mu.Lock()
27 defer c.mu.Unlock()
28 c.data[id] = d
29}
30
31func (c *ProgressCache) Get(id int64) (*LiveDownload, bool) {
32 c.mu.RLock()
33 defer c.mu.RUnlock()
34 d, ok := c.data[id]
35 return d, ok
36}
37
38func (c *ProgressCache) AppendLog(id int64, line string) {
39 c.mu.Lock()
40 defer c.mu.Unlock()
41 if d, ok := c.data[id]; ok {
42 d.Logs.WriteString(line)
43 d.Logs.WriteByte('\n')
44 d.LastUpdate = time.Now()
45 }
46}
47
48func (c *ProgressCache) GetLogs(id int64) string {
49 c.mu.RLock()
50 defer c.mu.RUnlock()
51 if d, ok := c.data[id]; ok {
52 return d.Logs.String()
53 }
54 return ""
55}
56
57func (c *ProgressCache) Delete(id int64) {
58 c.mu.Lock()
59 defer c.mu.Unlock()
60 delete(c.data, id)
61}
62
63func (c *ProgressCache) FlushLogs(id int64) string {
64 c.mu.Lock()
65 defer c.mu.Unlock()
66 if d, ok := c.data[id]; ok {
67 logs := d.Logs.String()
68 return logs
69 }
70 return ""
71}
72