aboutsummaryrefslogtreecommitdiff
path: root/steam/extract.go
diff options
context:
space:
mode:
Diffstat (limited to 'steam/extract.go')
-rw-r--r--steam/extract.go66
1 files changed, 66 insertions, 0 deletions
diff --git a/steam/extract.go b/steam/extract.go
new file mode 100644
index 0000000..f73d5f7
--- /dev/null
+++ b/steam/extract.go
@@ -0,0 +1,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
+
+}