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 }