package downloader
import (
"context"
"sync"
"github.com/go-faster/errors"
"github.com/gotd/td/tgerr"
)
type block struct {
chunk
offset int64
partSize int
}
func (b block ) last () bool {
return len (b .data ) < b .partSize
}
type reader struct {
sch schema
verifier *verifier
partSize int
offset int64
offsetMux sync .Mutex
}
func verifiedReader (sch schema , verifier *verifier ) *reader {
return &reader {
sch : sch ,
verifier : verifier ,
}
}
func plainReader (sch schema , partSize int ) *reader {
return &reader {
sch : sch ,
partSize : partSize ,
}
}
func (r *reader ) Next (ctx context .Context ) (block , error ) {
if r .verifier != nil {
return r .nextHashed (ctx )
}
return r .nextPlain (ctx )
}
func (r *reader ) nextHashed (ctx context .Context ) (block , error ) {
hash , ok , err := r .verifier .next (ctx )
if err != nil {
return block {}, err
}
if !ok {
return block {}, nil
}
b , err := r .next (ctx , hash .Offset , hash .Limit )
if err != nil {
return block {}, err
}
if !r .verifier .verify (hash , b .data ) {
return block {}, ErrHashMismatch
}
return b , nil
}
func (r *reader ) nextPlain (ctx context .Context ) (block , error ) {
r .offsetMux .Lock ()
offset := r .offset
r .offset += int64 (r .partSize )
r .offsetMux .Unlock ()
return r .next (ctx , offset , r .partSize )
}
func (r *reader ) next (ctx context .Context , offset int64 , limit int ) (block , error ) {
retryAttempt := 0
for {
ch , err := r .sch .Chunk (ctx , offset , limit )
if flood , err := tgerr .FloodWait (ctx , err ); err != nil {
if flood || isRetryableTimeout (ctx , err ) {
retryAttempt ++
reportSchemaRetry (r .sch , RetryOperationReaderChunk , retryAttempt , err )
continue
}
return block {}, errors .Wrap (err , "get next chunk" )
}
return block {
chunk : ch ,
offset : offset ,
partSize : r .partSize ,
}, nil
}
}
The pages are generated with Golds v0.8.4 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .