github.com/Files-com/files-sdk-go/v3@v3.1.81/file/manager/main.go (about)

     1  package manager
     2  
     3  import (
     4  	"math"
     5  	"net/http"
     6  
     7  	"github.com/Files-com/files-sdk-go/v3/lib"
     8  	"github.com/dnaeon/go-vcr/recorder"
     9  )
    10  
    11  var (
    12  	ConcurrentFiles         = 50
    13  	ConcurrentFileParts     = 50
    14  	ConcurrentDirectoryList = 100
    15  )
    16  
    17  type Manager struct {
    18  	FilesManager            ConcurrencyManager
    19  	FilePartsManager        ConcurrencyManager
    20  	DirectoryListingManager ConcurrencyManager
    21  }
    22  
    23  type ConcurrencyManager struct {
    24  	*lib.ConstrainedWorkGroup
    25  	DownloadFilesAsSingleStream bool
    26  }
    27  
    28  func (ConcurrencyManager) New(maxGoRoutines int, downloadFilesAsSingleStream ...bool) ConcurrencyManager {
    29  	if len(downloadFilesAsSingleStream) == 0 {
    30  		downloadFilesAsSingleStream = append(downloadFilesAsSingleStream, false)
    31  	}
    32  
    33  	return ConcurrencyManager{ConstrainedWorkGroup: lib.NewConstrainedWorkGroup(maxGoRoutines), DownloadFilesAsSingleStream: downloadFilesAsSingleStream[0]}
    34  }
    35  
    36  func (c ConcurrencyManager) Max() int {
    37  	return c.ConstrainedWorkGroup.Max()
    38  }
    39  
    40  func New(files, fileParts, directoryListing int) *Manager {
    41  	return &Manager{
    42  		FilesManager:            ConcurrencyManager{}.New(files),
    43  		FilePartsManager:        ConcurrencyManager{}.New(fileParts),
    44  		DirectoryListingManager: ConcurrencyManager{}.New(directoryListing),
    45  	}
    46  }
    47  
    48  func Default() *Manager {
    49  	return New(ConcurrentFiles, ConcurrentFileParts, ConcurrentDirectoryList)
    50  }
    51  
    52  func Sync() *Manager {
    53  	return New(1, 1, 1)
    54  }
    55  
    56  func Build(maxConcurrentConnections, maxConcurrentDirectoryLists int, downloadFilesAsSingleStream ...bool) *Manager {
    57  	maxConcurrentConnections = int(math.Max(float64(maxConcurrentConnections), 1))
    58  	return &Manager{
    59  		FilesManager:            ConcurrencyManager{}.New(maxConcurrentConnections),
    60  		FilePartsManager:        ConcurrencyManager{}.New(maxConcurrentConnections, downloadFilesAsSingleStream...),
    61  		DirectoryListingManager: ConcurrencyManager{}.New(int(math.Max(float64(maxConcurrentDirectoryLists), 1))),
    62  	}
    63  }
    64  
    65  func (m *Manager) CreateMatchingClient(client *http.Client) *http.Client {
    66  	switch t := client.Transport.(type) {
    67  	case *lib.Transport:
    68  		t.MaxConnsPerHost = m.FilePartsManager.Max()
    69  		return client
    70  	case *recorder.Recorder:
    71  		// Can't modify VCR in Test mode.
    72  		return client
    73  	default:
    74  		defaultTransport := lib.DefaultPooledTransport()
    75  		defaultTransport.MaxConnsPerHost = m.FilePartsManager.Max()
    76  		client.Transport = defaultTransport
    77  		return client
    78  	}
    79  }