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
60
61
62
63
64
65
66
|
package steam
import (
"errors"
"fmt"
"io"
"time"
)
// how often are we going to be updating our status information?
const updateEveryNBytes = 10 * 1024 * 1024 // 10mb
// extractUpdate takes care of updating the job as it goes along at updateEveryNBytes
// it will be reported back to the Job's status.
func (l *Library) extractUpdate(j *Job, g *Game, rdr io.ReadCloser) (*Game, error) {
rdr, wrtr := io.Pipe()
go func() {
var err error
g, err = l.extractPrimitive(j, g, rdr)
if err != nil {
j.addError(fmt.Errorf("Installer: extracting %s", err))
}
// resp.Body.Close()
rdr.Close()
}()
var total int64
var err error
for {
var n int64
n, err = io.CopyN(wrtr, rdr, updateEveryNBytes)
if err == io.EOF {
break
} else if err != nil {
j.addError(fmt.Errorf(
"Error encountered read error: %w", err))
break
}
total += n
j.setTransferred(total)
// rate in bytes/sec
rate := total / int64(time.Since(*j.StartTime()).Seconds())
estSize := j.GetSize()
if estSize == nil {
j.addError(errors.New("Expected an estimated size, got nil"))
continue
}
remaining := *estSize - total
j.setETA(time.Duration((remaining / rate) / 1000 / 1000 / 1000))
}
if err == io.EOF {
return g, nil
}
return g, err
}
|