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  }