diff options
Diffstat (limited to 'steam/extract.go')
| -rw-r--r-- | steam/extract.go | 66 |
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 + +} |
