You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
1.5 KiB
77 lines
1.5 KiB
// Package uploader contains uploading files helpers. |
|
package uploader |
|
|
|
import ( |
|
"io" |
|
"sync" |
|
|
|
"go.uber.org/atomic" |
|
) |
|
|
|
// NewUpload creates new Upload struct using given |
|
// name and reader. |
|
func NewUpload(name string, from io.Reader, total int64) *Upload { |
|
return &Upload{ |
|
name: name, |
|
totalBytes: total, |
|
from: from, |
|
partSize: -1, |
|
} |
|
} |
|
|
|
// Upload represents Telegram file upload. |
|
type Upload struct { |
|
// Fields which will be set by Uploader. |
|
// File ID for Telegram. |
|
id int64 |
|
// Sent parts (in partSize). |
|
sentParts atomic.Int64 |
|
|
|
// Confirmed uploaded parts. |
|
confirmedParts int |
|
// Confirmed uploaded bytes. |
|
confirmedBytes int64 |
|
confirmedMux sync.Mutex |
|
|
|
// Total parts. |
|
totalParts int |
|
// Part size of uploader. |
|
partSize int |
|
// Flag to determine class of size of file. |
|
big bool |
|
|
|
// Total size (in bytes) of upload. |
|
totalBytes int64 // immutable |
|
// Name of file. |
|
name string // immutable |
|
// Reader of data. |
|
from io.Reader // immutable |
|
} |
|
|
|
func (u *Upload) confirmSmall(bytes int) ProgressState { |
|
u.confirmedMux.Lock() |
|
defer u.confirmedMux.Unlock() |
|
|
|
u.confirmedParts++ |
|
return u.confirmLocked(u.confirmedParts, bytes) |
|
} |
|
|
|
func (u *Upload) confirm(part, bytes int) ProgressState { |
|
u.confirmedMux.Lock() |
|
defer u.confirmedMux.Unlock() |
|
|
|
return u.confirmLocked(part, bytes) |
|
} |
|
|
|
func (u *Upload) confirmLocked(part, bytes int) ProgressState { |
|
u.confirmedBytes += int64(bytes) |
|
|
|
return ProgressState{ |
|
ID: u.id, |
|
Name: u.name, |
|
Part: part, |
|
PartSize: u.partSize, |
|
Uploaded: u.confirmedBytes, |
|
Total: u.totalBytes, |
|
} |
|
}
|
|
|