Documentation ¶
Overview ¶
Package torrent provides a BitTorrent client implementation.
Index ¶
- Variables
- type AddTorrentOptions
- type AnnounceError
- type Config
- type InfoHash
- type Peer
- type PeerSource
- type Session
- func (s *Session) AddTorrent(r io.Reader, opt *AddTorrentOptions) (*Torrent, error)
- func (s *Session) AddURI(uri string, opt *AddTorrentOptions) (*Torrent, error)
- func (s *Session) Close() error
- func (s *Session) GetTorrent(id string) *Torrent
- func (s *Session) ListTorrents() []*Torrent
- func (s *Session) RemoveTorrent(id string) error
- func (s *Session) StartAll() error
- func (s *Session) Stats() SessionStats
- func (s *Session) StopAll() error
- type SessionStats
- type Stats
- type Status
- type Torrent
- func (t *Torrent) AddPeer(addr string) error
- func (t *Torrent) AddTracker(uri string) error
- func (t *Torrent) AddedAt() time.Time
- func (t *Torrent) Announce()
- func (t *Torrent) ID() string
- func (t *Torrent) InfoHash() InfoHash
- func (t *Torrent) Magnet() (string, error)
- func (t *Torrent) Move(target string) error
- func (t *Torrent) Name() string
- func (t *Torrent) Peers() []Peer
- func (t *Torrent) Port() int
- func (t *Torrent) Start() error
- func (t *Torrent) Stats() Stats
- func (t *Torrent) Stop() error
- func (t *Torrent) Torrent() ([]byte, error)
- func (t *Torrent) Trackers() []Tracker
- func (t *Torrent) Verify() error
- func (t *Torrent) Webseeds() []Webseed
- type Tracker
- type TrackerStatus
- type Webseed
Constants ¶
This section is empty.
Variables ¶
var DefaultConfig = Config{ Database: "~/rain/session.db", DataDir: "~/rain/data", DataDirIncludesTorrentID: true, PortBegin: 50000, PortEnd: 60000, MaxOpenFiles: 10240, PEXEnabled: true, ResumeWriteInterval: 30 * time.Second, PrivatePeerIDPrefix: "-RN" + Version + "-", PrivateExtensionHandshakeClientVersion: "Rain " + Version, BlocklistUpdateInterval: 24 * time.Hour, BlocklistUpdateTimeout: 10 * time.Minute, BlocklistEnabledForTrackers: true, BlocklistEnabledForOutgoingConnections: true, BlocklistEnabledForIncomingConnections: true, TorrentAddHTTPTimeout: 30 * time.Second, MaxMetadataSize: 10 << 20, MaxTorrentSize: 10 << 20, DNSResolveTimeout: 5 * time.Second, RPCEnabled: true, RPCHost: "127.0.0.1", RPCPort: 7246, RPCShutdownTimeout: 5 * time.Second, TrackerNumWant: 200, TrackerStopTimeout: 5 * time.Second, TrackerMinAnnounceInterval: time.Minute, TrackerHTTPTimeout: 10 * time.Second, TrackerHTTPPrivateUserAgent: "Rain/" + Version, TrackerHTTPMaxResponseSize: 2 << 20, TrackerHTTPVerifyTLS: true, DHTEnabled: true, DHTHost: "0.0.0.0", DHTPort: 7246, DHTAnnounceInterval: 30 * time.Minute, DHTMinAnnounceInterval: time.Minute, DHTBootstrapNodes: []string{ "router.bittorrent.com:6881", "dht.transmissionbt.com:6881", "router.utorrent.com:6881", "dht.libtorrent.org:25401", "dht.aelitis.com:6881", }, UnchokedPeers: 3, OptimisticUnchokedPeers: 1, MaxRequestsIn: 250, MaxRequestsOut: 250, DefaultRequestsOut: 50, RequestTimeout: 20 * time.Second, EndgameMaxDuplicateDownloads: 20, MaxPeerDial: 80, MaxPeerAccept: 20, ParallelMetadataDownloads: 2, PeerConnectTimeout: 5 * time.Second, PeerHandshakeTimeout: 10 * time.Second, PieceReadTimeout: 30 * time.Second, MaxPeerAddresses: 2000, AllowedFastSet: 10, ReadCacheBlockSize: 128 << 10, ReadCacheSize: 256 << 20, ReadCacheTTL: 1 * time.Minute, ParallelReads: 1, ParallelWrites: 1, WriteCacheSize: 1 << 30, WebseedDialTimeout: 10 * time.Second, WebseedTLSHandshakeTimeout: 10 * time.Second, WebseedResponseHeaderTimeout: 10 * time.Second, WebseedResponseBodyReadTimeout: 10 * time.Second, WebseedRetryInterval: time.Minute, WebseedVerifyTLS: true, WebseedMaxSources: 10, WebseedMaxDownloads: 4, GraphiteFlushInterval: 10 * time.Second, GraphitePrefix: "rain.{hostname}", }
var Version = "0.0.0"
Version of client. Set during build. "0.0.0" is the development version.
Functions ¶
This section is empty.
Types ¶
type AddTorrentOptions ¶ added in v0.8.7
type AnnounceError ¶ added in v0.9.0
type AnnounceError struct {
// contains filtered or unexported fields
}
func (*AnnounceError) Error ¶ added in v0.9.0
func (e *AnnounceError) Error() string
func (*AnnounceError) Unknown ¶ added in v0.9.0
func (e *AnnounceError) Unknown() bool
func (*AnnounceError) Unwrap ¶ added in v0.9.0
func (e *AnnounceError) Unwrap() error
type Config ¶
type Config struct { // Database file to save resume data. Database string // DataDir is where files are downloaded. DataDir string // If true, torrent files are saved into <data_dir>/<torrent_id>/<torrent_name>. // Useful if downloading the same torrent from multiple sources. DataDirIncludesTorrentID bool // New torrents will be listened at selected port in this range. PortBegin, PortEnd uint16 // At start, client will set max open files limit to this number. (like "ulimit -n" command) MaxOpenFiles uint64 // Enable peer exchange protocol. PEXEnabled bool // Resume data (bitfield & stats) are saved to disk at interval to keep IO lower. ResumeWriteInterval time.Duration // Peer id is prefixed with this string. See BEP 20. Remaining bytes of peer id will be randomized. // Only applies to private torrents. PrivatePeerIDPrefix string // Client version that is sent in BEP 10 handshake message. // Only applies to private torrents. PrivateExtensionHandshakeClientVersion string // URL to the blocklist file in CIDR format. BlocklistURL string // When to refresh blocklist BlocklistUpdateInterval time.Duration // HTTP timeout for downloading blocklist BlocklistUpdateTimeout time.Duration // Do not contact tracker if it's IP is blocked BlocklistEnabledForTrackers bool // Do not connect to peer if it's IP is blocked BlocklistEnabledForOutgoingConnections bool // Do not accept connections from peer if it's IP is blocked BlocklistEnabledForIncomingConnections bool // Time to wait when adding torrent with AddURI(). TorrentAddHTTPTimeout time.Duration // Maximum allowed size to be received by metadata extension. MaxMetadataSize uint // Maximum allowed size to be read when adding torrent. MaxTorrentSize uint // Time to wait when resolving host names for trackers and peers. DNSResolveTimeout time.Duration // Global download speed limit in KB/s. SpeedLimitDownload int64 // Global upload speed limit in KB/s. SpeedLimitUpload int64 // Enable RPC server RPCEnabled bool // Host to listen for RPC server RPCHost string // Listen port for RPC server RPCPort int // Time to wait for ongoing requests before shutting down RPC HTTP server. RPCShutdownTimeout time.Duration // Enable DHT node. DHTEnabled bool // DHT node will listen on this IP. DHTHost string // DHT node will listen on this UDP port. DHTPort uint16 // DHT announce interval DHTAnnounceInterval time.Duration // Minimum announce interval when announcing to DHT. DHTMinAnnounceInterval time.Duration // Known routers to bootstrap local DHT node. DHTBootstrapNodes []string // Number of peer addresses to request in announce request. TrackerNumWant int // Time to wait for announcing stopped event. // Stopped event is sent to the tracker when torrent is stopped. TrackerStopTimeout time.Duration // When the client needs new peer addresses to connect, it ask to the tracker. // To prevent spamming the tracker an interval is set to wait before the next announce. TrackerMinAnnounceInterval time.Duration // Total time to wait for response to be read. // This includes ConnectTimeout and TLSHandshakeTimeout. TrackerHTTPTimeout time.Duration // User agent sent when communicating with HTTP trackers. // Only applies to private torrents. TrackerHTTPPrivateUserAgent string // Max number of bytes in a tracker response. TrackerHTTPMaxResponseSize uint // Check and validate TLS ceritificates. TrackerHTTPVerifyTLS bool // Number of unchoked peers. UnchokedPeers int // Number of optimistic unchoked peers. OptimisticUnchokedPeers int // Max number of blocks allowed to be queued without dropping any. MaxRequestsIn int // Max number of blocks requested from a peer but not received yet. // `rreq` value from extended handshake cannot exceed this limit. MaxRequestsOut int // Number of bloks requested from peer if it does not send `rreq` value in extended handshake. DefaultRequestsOut int // Time to wait for a requested block to be received before marking peer as snubbed RequestTimeout time.Duration // Max number of running downloads on piece in endgame mode, snubbed and choed peers don't count EndgameMaxDuplicateDownloads int // Max number of outgoing connections to dial MaxPeerDial int // Max number of incoming connections to accept MaxPeerAccept int // Running metadata downloads, snubbed peers don't count ParallelMetadataDownloads int // Time to wait for TCP connection to open. PeerConnectTimeout time.Duration // Time to wait for BitTorrent handshake to complete. PeerHandshakeTimeout time.Duration // When peer has started to send piece block, if it does not send any bytes in PieceReadTimeout, the connection is closed. PieceReadTimeout time.Duration // Max number of peer addresses to keep in connect queue. MaxPeerAddresses int // Number of allowed-fast messages to send after handshake. AllowedFastSet int // Number of bytes to read when a piece is requested by a peer. ReadCacheBlockSize int64 // Number of cached bytes for piece read requests. ReadCacheSize int64 // Read bytes for a piece part expires after duration. ReadCacheTTL time.Duration // Number of read operations to do in parallel. ParallelReads uint // Number of write operations to do in parallel. ParallelWrites uint // Number of bytes allocated in memory for downloading piece data. WriteCacheSize int64 // When the client want to connect a peer, first it tries to do encrypted handshake. // If it does not work, it connects to same peer again and does unencrypted handshake. // This behavior can be changed via this variable. DisableOutgoingEncryption bool // Dial only encrypted connections. ForceOutgoingEncryption bool // Do not accept unencrypted connections. ForceIncomingEncryption bool // TCP connect timeout for WebSeed sources WebseedDialTimeout time.Duration // TLS handshake timeout for WebSeed sources WebseedTLSHandshakeTimeout time.Duration // HTTP header timeout for WebSeed sources WebseedResponseHeaderTimeout time.Duration // HTTP body read timeout for Webseed sources WebseedResponseBodyReadTimeout time.Duration // Retry interval for restarting failed downloads WebseedRetryInterval time.Duration // Verify TLS certificate for WebSeed URLs WebseedVerifyTLS bool // Limit the number of WebSeed sources in torrent. WebseedMaxSources int // Number of maximum simulateous downloads from WebSeed sources. WebseedMaxDownloads int // Send metrics to graphite server GraphiteAddr string // Graphite flush interval GraphiteFlushInterval time.Duration // Prefix metric names GraphitePrefix string }
Config for Session.
type InfoHash ¶
type InfoHash [20]byte
InfoHash is the unique value that represents the files in a torrent.
type Peer ¶
type Peer struct { ID [20]byte Client string Addr net.Addr Source PeerSource ConnectedAt time.Time Downloading bool ClientInterested bool ClientChoking bool PeerInterested bool PeerChoking bool OptimisticUnchoked bool Snubbed bool EncryptedHandshake bool EncryptedStream bool DownloadSpeed int UploadSpeed int }
type PeerSource ¶
type PeerSource int
const ( SourceTracker PeerSource = iota SourceDHT SourcePEX SourceIncoming SourceManual )
type Session ¶
type Session struct {
// contains filtered or unexported fields
}
Session contains torrents, DHT node, caches and other data structures shared by multiple torrents.
func NewSession ¶ added in v0.7.3
NewSession creates a new Session for downloading and seeding torrents. Returned session must be closed after use.
func (*Session) AddTorrent ¶
func (*Session) AddURI ¶
func (s *Session) AddURI(uri string, opt *AddTorrentOptions) (*Torrent, error)
func (*Session) GetTorrent ¶
func (*Session) ListTorrents ¶
func (*Session) RemoveTorrent ¶
func (*Session) Stats ¶
func (s *Session) Stats() SessionStats
type SessionStats ¶
type SessionStats struct { Uptime time.Duration Torrents int Peers int PortsAvailable int BlockListRules int BlockListRecency time.Duration ReadCacheObjects int ReadCacheSize int64 ReadCacheUtilization int ReadsPerSecond int ReadsActive int ReadsPending int WriteCacheObjects int WriteCacheSize int64 WriteCachePendingKeys int WritesPerSecond int WritesActive int WritesPending int SpeedDownload int SpeedUpload int SpeedRead int SpeedWrite int }
type Stats ¶
type Stats struct { // Info hash of torrent. InfoHash InfoHash // Listening port number. Port int // Status of the torrent. Status Status // Contains the error message if torrent is stopped unexpectedly. Error error Pieces struct { // Number of pieces that are checked when torrent is in "Verifying" state. Checked uint32 // Number of pieces that we are downloaded successfully and verivied by hash check. Have uint32 // Number of pieces that need to be downloaded. Some of them may be being downloaded. // Pieces that are being downloaded may counted as missing until they are downloaded and passed hash check. Missing uint32 // Number of unique pieces available on swarm. // If this number is less then the number of total pieces, the download may never finish. Available uint32 // Number of total pieces in torrent. Total uint32 } Bytes struct { // Bytes that are downloaded and passed hash check. Completed int64 // The number of bytes that is needed to complete all missing pieces. Incomplete int64 // The number of total bytes of files in torrent. Total = Completed + Incomplete Total int64 // Downloaded is the number of bytes downloaded from swarm. // Because some pieces may be downloaded more than once, this number may be greater than completed bytes. Downloaded int64 // BytesUploaded is the number of bytes uploaded to the swarm. Uploaded int64 // Bytes downloaded due to duplicate/non-requested pieces. Wasted int64 // Bytes allocated on storage. Allocated int64 } Peers struct { // Number of peers that are connected, handshaked and ready to send and receive messages. Total int // Number of peers that have connected to us. Incoming int // Number of peers that we have connected to. Outgoing int } Handshakes struct { // Number of peers that are not handshaked yet. Total int // Number of incoming peers in handshake state. Incoming int // Number of outgoing peers in handshake state. Outgoing int } Addresses struct { // Total number of peer addresses that are ready to be connected. Total int // Peers found via trackers. Tracker int // Peers found via DHT node. DHT int // Peers found via peer exchange. PEX int } Downloads struct { // Number of active piece downloads. Total int // Number of pieces that are being downloaded normally. Running int // Number of pieces that are being downloaded too slow. Snubbed int // Number of piece downloads in choked state. Choked int } MetadataDownloads struct { // Number of active metadata downloads. Total int // Number of peers that uploading too slow. Snubbed int // Number of peers that are being downloaded normally. Running int } // Name can change after metadata is downloaded. Name string // Is private torrent? Private bool // Length of a single piece. PieceLength uint32 // Duration while the torrent is in Seeding status. SeededFor time.Duration // Speed is calculated as 1-minute moving average. Speed struct { // Downloaded bytes per second. Download int // Uploaded bytes per second. Upload int } // Time remaining to complete download. nil value means infinity. ETA *time.Duration }
Stats contains statistics about Torrent.
type Torrent ¶
type Torrent struct {
// contains filtered or unexported fields
}
Torrent is created from a torrent file or a magnet link.
func (*Torrent) AddPeer ¶ added in v0.4.0
AddPeer adds a new peer to the torrent. Does nothing if torrent is stopped.
func (*Torrent) AddTracker ¶ added in v0.4.0
AddTracker adds a new tracker to the torrent.
func (*Torrent) Announce ¶ added in v0.10.0
func (t *Torrent) Announce()
Announce the torrent to all trackers and DHT. It does not overrides the minimum interval value sent by the trackers or set in Config.
func (*Torrent) InfoHash ¶
InfoHash returns the hash of the info dictionary of torrent file. Two different torrents may have the same info hash.
func (*Torrent) Peers ¶
Peers returns the list of connected (handshake completed) peers of the torrent.
func (*Torrent) Start ¶
Start downloading the torrent. If all pieces are completed, starts seeding them.
func (*Torrent) Stop ¶
Stop the torrent. Does not block. After Stop is called, the torrent switches into Stopping state. During Stopping state, a stop event sent to trackers with a timeout. At most 5 seconds later, the torrent switches into Stopped state.
type Tracker ¶
type Tracker struct { URL string Status TrackerStatus Leechers int Seeders int Error *AnnounceError Warning string LastAnnounce time.Time NextAnnounce time.Time }
type TrackerStatus ¶
type TrackerStatus int
const ( NotContactedYet TrackerStatus = iota Contacting Working NotWorking )
Source Files ¶
- config.go
- rlimit.go
- session.go
- session_add.go
- session_blocklist.go
- session_dht.go
- session_healthcheck.go
- session_load.go
- session_metrics.go
- session_rpc_handler.go
- session_rpc_server.go
- session_stats.go
- session_torrent.go
- torrent.go
- torrent_allocation.go
- torrent_announce.go
- torrent_close.go
- torrent_commands.go
- torrent_connection.go
- torrent_handshake.go
- torrent_infodownload.go
- torrent_messagehandler.go
- torrent_metadataextension.go
- torrent_peer.go
- torrent_pex.go
- torrent_pieces.go
- torrent_run.go
- torrent_start.go
- torrent_stats.go
- torrent_status.go
- torrent_stop.go
- torrent_verification.go
- torrent_webseed.go
- torrent_write.go
- version.go