gitlab.nesad.fit.vutbr.cz/blended/libblended@v0.0.0-20221202124402-2bee159339df/ipfs/download.go (about) 1 package ipfs 2 3 import ( 4 "context" 5 "github.com/whyrusleeping/tar-utils" 6 "io" 7 ) 8 9 type downloadFileReader struct { 10 io.Reader 11 Current int 12 Stat *IpfsStat 13 ProgressCallback func(event ProgressEvent) 14 } 15 16 func (downloadReader *downloadFileReader) Read(p []byte) (int, error) { 17 n, err := downloadReader.Reader.Read(p) 18 downloadReader.Current += n 19 20 if err == nil && downloadReader.ProgressCallback != nil { 21 downloadReader.ProgressCallback(ProgressEvent{ 22 Name: downloadReader.Stat.Hash, 23 Hash: downloadReader.Stat.Hash, 24 Bytes: int64(downloadReader.Current), 25 Size: int64(downloadReader.Stat.CumulativeSize), 26 }) 27 } 28 29 return n, err 30 } 31 32 // download file or dir 33 func (c *IpfsClient) Download(hash string, outDir string, progressCallback func(event ProgressEvent)) error { 34 stat, err := c.Stat(hash) 35 if err != nil { 36 return err 37 } 38 39 response, err := c.Shell.Request("get", hash). 40 Option("create", true). 41 Send(context.Background()) 42 43 if err != nil { 44 return err 45 } 46 defer response.Close() 47 48 if response.Error != nil { 49 return response.Error 50 } 51 52 extractor := &tar.Extractor{Path: outDir} 53 return extractor.Extract(&downloadFileReader{ 54 Reader: response.Output, 55 Stat: stat, 56 ProgressCallback: progressCallback}) 57 }