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 }