/
uploader_progress.go
59 lines (44 loc) · 1 KB
/
uploader_progress.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package telegram
import (
"context"
"sync"
"github.com/gotd/td/telegram/uploader"
"go.uber.org/atomic"
)
type UploaderProgress struct {
progress *atomic.Int32 // 0 - 100
progressChangeCh chan int32
closed bool
mu sync.Mutex
}
func NewUploaderProgress() *UploaderProgress {
return &UploaderProgress{
progress: atomic.NewInt32(-1),
progressChangeCh: make(chan int32, 101),
}
}
func (up *UploaderProgress) Chunk(_ context.Context, state uploader.ProgressState) error {
newProgress := int32(state.Uploaded / (state.Total / 100))
if newProgress > 100 {
newProgress = 100
}
if up.progress.Load() == newProgress {
return nil
}
up.progress.Store(newProgress)
up.mu.Lock()
defer up.mu.Unlock()
if !up.closed {
up.progressChangeCh <- newProgress
}
return nil
}
func (up *UploaderProgress) ProgressChan() <-chan int32 {
return up.progressChangeCh
}
func (up *UploaderProgress) Close() {
up.mu.Lock()
defer up.mu.Unlock()
up.closed = true
close(up.progressChangeCh)
}