librats 1.0.2 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +145 -331
- package/binding.gyp +16 -3
- package/lib/index.d.ts +288 -696
- package/lib/index.js +407 -44
- package/native-src/3rdparty/android/ifaddrs-android.c +1 -0
- package/native-src/3rdparty/android/ifaddrs-android.h +1 -0
- package/native-src/CMakeLists.txt +404 -179
- package/native-src/LICENSE +1 -1
- package/native-src/src/librats/bindings/rats.cpp +762 -0
- package/native-src/src/librats/bindings/rats.h +380 -0
- package/native-src/src/librats/bittorrent/bencode.cpp +437 -0
- package/native-src/src/librats/bittorrent/bencode.h +176 -0
- package/native-src/src/librats/bittorrent/bitfield.cpp +97 -0
- package/native-src/src/librats/bittorrent/bitfield.h +76 -0
- package/native-src/src/librats/bittorrent/byte_io.h +58 -0
- package/native-src/src/librats/bittorrent/choker.cpp +25 -0
- package/native-src/src/librats/bittorrent/choker.h +46 -0
- package/native-src/src/librats/bittorrent/client.cpp +413 -0
- package/native-src/src/librats/bittorrent/client.h +227 -0
- package/native-src/src/librats/bittorrent/disk_io.cpp +209 -0
- package/native-src/src/librats/bittorrent/disk_io.h +150 -0
- package/native-src/src/librats/bittorrent/extensions.cpp +191 -0
- package/native-src/src/librats/bittorrent/extensions.h +94 -0
- package/native-src/src/librats/bittorrent/file_storage.cpp +77 -0
- package/native-src/src/librats/bittorrent/file_storage.h +79 -0
- package/native-src/src/librats/bittorrent/log.h +42 -0
- package/native-src/src/librats/bittorrent/magnet_uri.cpp +98 -0
- package/native-src/src/librats/bittorrent/magnet_uri.h +35 -0
- package/native-src/src/librats/bittorrent/peer_connection.cpp +502 -0
- package/native-src/src/librats/bittorrent/peer_connection.h +194 -0
- package/native-src/src/librats/bittorrent/peer_list.cpp +68 -0
- package/native-src/src/librats/bittorrent/peer_list.h +75 -0
- package/native-src/src/librats/bittorrent/piece_picker.cpp +352 -0
- package/native-src/src/librats/bittorrent/piece_picker.h +201 -0
- package/native-src/src/librats/bittorrent/reactor.cpp +97 -0
- package/native-src/src/librats/bittorrent/reactor.h +89 -0
- package/native-src/src/librats/bittorrent/resume_data.cpp +72 -0
- package/native-src/src/librats/bittorrent/resume_data.h +41 -0
- package/native-src/src/librats/bittorrent/store_buffer.cpp +48 -0
- package/native-src/src/librats/bittorrent/store_buffer.h +47 -0
- package/native-src/src/librats/bittorrent/torrent.cpp +870 -0
- package/native-src/src/librats/bittorrent/torrent.h +260 -0
- package/native-src/src/librats/bittorrent/torrent_creator.cpp +129 -0
- package/native-src/src/librats/bittorrent/torrent_creator.h +58 -0
- package/native-src/src/librats/bittorrent/torrent_info.cpp +314 -0
- package/native-src/src/librats/bittorrent/torrent_info.h +118 -0
- package/native-src/src/librats/bittorrent/tracker.cpp +374 -0
- package/native-src/src/librats/bittorrent/tracker.h +108 -0
- package/native-src/src/librats/bittorrent/types.cpp +206 -0
- package/native-src/src/librats/bittorrent/types.h +86 -0
- package/native-src/src/librats/core/address.cpp +35 -0
- package/native-src/src/librats/core/address.h +78 -0
- package/native-src/src/librats/core/bytes.h +69 -0
- package/native-src/src/librats/core/chained_send_buffer.cpp +172 -0
- package/native-src/src/librats/core/chained_send_buffer.h +183 -0
- package/native-src/src/librats/core/endpoint_parse.cpp +41 -0
- package/native-src/src/librats/core/endpoint_parse.h +31 -0
- package/native-src/src/librats/core/event_bus.h +70 -0
- package/native-src/src/librats/core/host_endpoint.h +56 -0
- package/native-src/src/{io_poller.cpp → librats/core/io_poller.cpp} +520 -65
- package/native-src/src/{io_poller.h → librats/core/io_poller.h} +12 -6
- package/native-src/src/librats/core/ip_address.cpp +120 -0
- package/native-src/src/librats/core/ip_address.h +109 -0
- package/native-src/src/librats/core/mpsc_queue.h +47 -0
- package/native-src/src/librats/core/notifier.h +74 -0
- package/native-src/src/librats/core/receive_buffer.cpp +219 -0
- package/native-src/src/librats/core/receive_buffer.h +171 -0
- package/native-src/src/librats/core/service_registry.h +58 -0
- package/native-src/src/{socket.cpp → librats/core/socket.cpp} +625 -118
- package/native-src/src/librats/core/socket.h +496 -0
- package/native-src/src/librats/core/timer_queue.h +105 -0
- package/native-src/src/librats/core/types.cpp +43 -0
- package/native-src/src/librats/core/types.h +103 -0
- package/native-src/src/librats/core/wakeup_pipe.h +83 -0
- package/native-src/src/{crypto → librats/crypto}/blake2_endian.h +21 -23
- package/native-src/src/{crypto → librats/crypto}/blake2b.c +34 -33
- package/native-src/src/{crypto → librats/crypto}/blake2b.h +7 -6
- package/native-src/src/{crypto → librats/crypto}/blake2s.c +55 -54
- package/native-src/src/{crypto → librats/crypto}/blake2s.h +13 -12
- package/native-src/src/{crypto → librats/crypto}/chacha.c +22 -21
- package/native-src/src/{crypto → librats/crypto}/chacha.h +14 -13
- package/native-src/src/{crypto → librats/crypto}/chachapoly.c +56 -56
- package/native-src/src/{crypto → librats/crypto}/chachapoly.h +24 -17
- package/native-src/src/{crc32.cpp → librats/crypto/crc32.cpp} +1 -1
- package/native-src/src/{crc32.h → librats/crypto/crc32.h} +3 -1
- package/native-src/src/{crypto → librats/crypto}/curve25519.c +6 -4
- package/native-src/src/{crypto → librats/crypto}/curve25519.h +6 -3
- package/native-src/src/librats/crypto/hkdf.c +266 -0
- package/native-src/src/{crypto → librats/crypto}/hkdf.h +19 -19
- package/native-src/src/{noise.cpp → librats/crypto/noise.cpp} +84 -73
- package/native-src/src/{noise.h → librats/crypto/noise.h} +18 -8
- package/native-src/src/{crypto → librats/crypto}/poly1305.c +47 -46
- package/native-src/src/librats/crypto/poly1305.h +37 -0
- package/native-src/src/{sha1.cpp → librats/crypto/sha1.cpp} +33 -1
- package/native-src/src/{sha1.h → librats/crypto/sha1.h} +14 -6
- package/native-src/src/{crypto → librats/crypto}/sha256.c +15 -14
- package/native-src/src/{crypto → librats/crypto}/sha256.h +8 -7
- package/native-src/src/{crypto → librats/crypto}/sha512.c +15 -14
- package/native-src/src/{crypto → librats/crypto}/sha512.h +8 -7
- package/native-src/src/librats/dht/announce.cpp +37 -0
- package/native-src/src/librats/dht/announce.h +41 -0
- package/native-src/src/librats/dht/bep42.cpp +109 -0
- package/native-src/src/librats/dht/bep42.h +48 -0
- package/native-src/src/librats/dht/dht.cpp +501 -0
- package/native-src/src/librats/dht/dht.h +119 -0
- package/native-src/src/librats/dht/dht_runner.cpp +103 -0
- package/native-src/src/librats/dht/dht_runner.h +71 -0
- package/native-src/src/librats/dht/dos_blocker.cpp +42 -0
- package/native-src/src/librats/dht/dos_blocker.h +47 -0
- package/native-src/src/librats/dht/find_peers.cpp +52 -0
- package/native-src/src/librats/dht/find_peers.h +73 -0
- package/native-src/src/librats/dht/id.h +167 -0
- package/native-src/src/{krpc.cpp → librats/dht/krpc.cpp} +32 -81
- package/native-src/src/{krpc.h → librats/dht/krpc.h} +19 -23
- package/native-src/src/librats/dht/log.h +38 -0
- package/native-src/src/librats/dht/node.cpp +473 -0
- package/native-src/src/librats/dht/node.h +164 -0
- package/native-src/src/librats/dht/node_entry.h +81 -0
- package/native-src/src/librats/dht/observer.h +72 -0
- package/native-src/src/librats/dht/persistence.cpp +90 -0
- package/native-src/src/librats/dht/persistence.h +32 -0
- package/native-src/src/librats/dht/routing_table.cpp +559 -0
- package/native-src/src/librats/dht/routing_table.h +185 -0
- package/native-src/src/librats/dht/rpc_manager.cpp +127 -0
- package/native-src/src/librats/dht/rpc_manager.h +77 -0
- package/native-src/src/librats/dht/storage.cpp +92 -0
- package/native-src/src/librats/dht/storage.h +74 -0
- package/native-src/src/librats/dht/transport.h +27 -0
- package/native-src/src/librats/dht/traversal.cpp +326 -0
- package/native-src/src/librats/dht/traversal.h +120 -0
- package/native-src/src/librats/dht/udp_transport.cpp +49 -0
- package/native-src/src/librats/dht/udp_transport.h +51 -0
- package/native-src/src/librats/mdns/log.h +22 -0
- package/native-src/src/{mdns.cpp → librats/mdns/mdns.cpp} +75 -40
- package/native-src/src/{mdns.h → librats/mdns/mdns.h} +9 -8
- package/native-src/src/{natpmp.cpp → librats/nat/natpmp.cpp} +12 -9
- package/native-src/src/{natpmp.h → librats/nat/natpmp.h} +3 -3
- package/native-src/src/{port_mapping.h → librats/nat/port_mapping.h} +3 -2
- package/native-src/src/{stun.cpp → librats/nat/stun.cpp} +4 -4
- package/native-src/src/{stun.h → librats/nat/stun.h} +1 -1
- package/native-src/src/{upnp.cpp → librats/nat/upnp.cpp} +6 -6
- package/native-src/src/{upnp.h → librats/nat/upnp.h} +2 -2
- package/native-src/src/librats/node/circuit_service.h +84 -0
- package/native-src/src/librats/node/config.h +110 -0
- package/native-src/src/librats/node/dial_service.h +54 -0
- package/native-src/src/librats/node/dialer.cpp +264 -0
- package/native-src/src/librats/node/dialer.h +188 -0
- package/native-src/src/librats/node/host_events.h +26 -0
- package/native-src/src/librats/node/identify.cpp +130 -0
- package/native-src/src/librats/node/identify.h +71 -0
- package/native-src/src/librats/node/nat_status.cpp +103 -0
- package/native-src/src/librats/node/nat_status.h +118 -0
- package/native-src/src/librats/node/node.cpp +865 -0
- package/native-src/src/librats/node/node.h +344 -0
- package/native-src/src/librats/node/node_context.h +33 -0
- package/native-src/src/librats/node/peer_network.h +91 -0
- package/native-src/src/librats/peer/peer.h +49 -0
- package/native-src/src/librats/peer/peer_book.cpp +181 -0
- package/native-src/src/librats/peer/peer_book.h +88 -0
- package/native-src/src/librats/peer/peer_id.cpp +72 -0
- package/native-src/src/librats/peer/peer_id.h +62 -0
- package/native-src/src/librats/peer/peer_info.h +37 -0
- package/native-src/src/librats/peer/peer_table.cpp +170 -0
- package/native-src/src/librats/peer/peer_table.h +148 -0
- package/native-src/src/librats/security/handshaker.h +66 -0
- package/native-src/src/librats/security/identity.h +43 -0
- package/native-src/src/librats/security/noise_security.cpp +122 -0
- package/native-src/src/librats/security/noise_security.h +37 -0
- package/native-src/src/librats/security/plaintext_security.h +106 -0
- package/native-src/src/librats/security/session.h +37 -0
- package/native-src/src/{storage.cpp → librats/storage/storage.cpp} +369 -522
- package/native-src/src/{storage.h → librats/storage/storage.h} +135 -299
- package/native-src/src/librats/subsystems/bittorrent.cpp +211 -0
- package/native-src/src/librats/subsystems/bittorrent.h +136 -0
- package/native-src/src/librats/subsystems/dht_discovery.cpp +202 -0
- package/native-src/src/librats/subsystems/dht_discovery.h +123 -0
- package/native-src/src/librats/subsystems/dht_service.h +36 -0
- package/native-src/src/librats/subsystems/file_transfer.cpp +972 -0
- package/native-src/src/librats/subsystems/file_transfer.h +367 -0
- package/native-src/src/librats/subsystems/hole_punch.cpp +605 -0
- package/native-src/src/librats/subsystems/hole_punch.h +290 -0
- package/native-src/src/librats/subsystems/hole_punch_service.h +38 -0
- package/native-src/src/librats/subsystems/mdns_discovery.cpp +66 -0
- package/native-src/src/librats/subsystems/mdns_discovery.h +55 -0
- package/native-src/src/librats/subsystems/message_json.cpp +112 -0
- package/native-src/src/librats/subsystems/message_json.h +88 -0
- package/native-src/src/librats/subsystems/peer_exchange.cpp +241 -0
- package/native-src/src/librats/subsystems/peer_exchange.h +136 -0
- package/native-src/src/librats/subsystems/ping_service.cpp +98 -0
- package/native-src/src/librats/subsystems/ping_service.h +66 -0
- package/native-src/src/librats/subsystems/port_mapping_service.cpp +192 -0
- package/native-src/src/librats/subsystems/port_mapping_service.h +84 -0
- package/native-src/src/librats/subsystems/pubsub.cpp +567 -0
- package/native-src/src/librats/subsystems/pubsub.h +175 -0
- package/native-src/src/librats/subsystems/reconnection.cpp +239 -0
- package/native-src/src/librats/subsystems/reconnection.h +126 -0
- package/native-src/src/librats/subsystems/relay.cpp +1142 -0
- package/native-src/src/librats/subsystems/relay.h +211 -0
- package/native-src/src/librats/subsystems/relay_service.h +46 -0
- package/native-src/src/librats/transport/connection.cpp +343 -0
- package/native-src/src/librats/transport/connection.h +283 -0
- package/native-src/src/librats/transport/link.h +96 -0
- package/native-src/src/librats/transport/reactor.cpp +588 -0
- package/native-src/src/librats/transport/reactor.h +262 -0
- package/native-src/src/librats/transport/reactor_pool.h +81 -0
- package/native-src/src/librats/transport/relay_link.cpp +208 -0
- package/native-src/src/librats/transport/relay_link.h +303 -0
- package/native-src/src/librats/transport/tcp_link.cpp +49 -0
- package/native-src/src/librats/transport/tcp_link.h +43 -0
- package/native-src/src/librats/transport/udp_mux.cpp +617 -0
- package/native-src/src/librats/transport/udp_mux.h +363 -0
- package/native-src/src/librats/transport/udp_packet.cpp +121 -0
- package/native-src/src/librats/transport/udp_packet.h +190 -0
- package/native-src/src/librats/transport/udp_stream.cpp +1194 -0
- package/native-src/src/librats/transport/udp_stream.h +614 -0
- package/native-src/src/librats/util/features.h.in +51 -0
- package/native-src/src/{fs.cpp → librats/util/fs.cpp} +51 -3
- package/native-src/src/librats/util/fs.h +136 -0
- package/native-src/src/librats/util/json.cpp +1002 -0
- package/native-src/src/librats/util/json.h +444 -0
- package/native-src/src/{logger.cpp → librats/util/logger.cpp} +1 -1
- package/native-src/src/{logger.h → librats/util/logger.h} +43 -31
- package/native-src/src/{network_monitor.cpp → librats/util/network_monitor.cpp} +12 -4
- package/native-src/src/{network_monitor.h → librats/util/network_monitor.h} +2 -1
- package/native-src/src/{network_utils.cpp → librats/util/network_utils.cpp} +38 -23
- package/native-src/src/{network_utils.h → librats/util/network_utils.h} +15 -8
- package/native-src/src/{os.cpp → librats/util/os.cpp} +48 -18
- package/native-src/src/librats/util/rats_export.h +69 -0
- package/native-src/src/{version.cpp → librats/util/version.cpp} +2 -2
- package/native-src/src/{version.h.in → librats/util/version.h.in} +1 -1
- package/native-src/src/librats/wire/frame.cpp +76 -0
- package/native-src/src/librats/wire/frame.h +111 -0
- package/native-src/src/librats/wire/message_router.cpp +45 -0
- package/native-src/src/librats/wire/message_router.h +47 -0
- package/package.json +5 -4
- package/scripts/build-librats.js +1 -0
- package/scripts/postinstall.js +3 -3
- package/scripts/prepare-package.js +4 -4
- package/scripts/verify-installation.js +63 -105
- package/src/librats_node.cpp +1067 -1323
- package/native-src/src/bencode.cpp +0 -485
- package/native-src/src/bencode.h +0 -145
- package/native-src/src/bittorrent.cpp +0 -14
- package/native-src/src/bittorrent.h +0 -74
- package/native-src/src/bt_bitfield.cpp +0 -372
- package/native-src/src/bt_bitfield.h +0 -316
- package/native-src/src/bt_choker.cpp +0 -228
- package/native-src/src/bt_choker.h +0 -147
- package/native-src/src/bt_client.cpp +0 -1047
- package/native-src/src/bt_client.h +0 -445
- package/native-src/src/bt_create_torrent.cpp +0 -677
- package/native-src/src/bt_create_torrent.h +0 -473
- package/native-src/src/bt_extension.cpp +0 -469
- package/native-src/src/bt_extension.h +0 -309
- package/native-src/src/bt_file_storage.cpp +0 -261
- package/native-src/src/bt_file_storage.h +0 -298
- package/native-src/src/bt_handshake.cpp +0 -134
- package/native-src/src/bt_handshake.h +0 -157
- package/native-src/src/bt_messages.cpp +0 -364
- package/native-src/src/bt_messages.h +0 -324
- package/native-src/src/bt_network.cpp +0 -1007
- package/native-src/src/bt_network.h +0 -417
- package/native-src/src/bt_peer_connection.cpp +0 -742
- package/native-src/src/bt_peer_connection.h +0 -592
- package/native-src/src/bt_piece_picker.cpp +0 -786
- package/native-src/src/bt_piece_picker.h +0 -473
- package/native-src/src/bt_resume_data.cpp +0 -410
- package/native-src/src/bt_resume_data.h +0 -249
- package/native-src/src/bt_torrent.cpp +0 -2120
- package/native-src/src/bt_torrent.h +0 -641
- package/native-src/src/bt_torrent_info.cpp +0 -659
- package/native-src/src/bt_torrent_info.h +0 -418
- package/native-src/src/bt_types.h +0 -621
- package/native-src/src/chained_send_buffer.cpp +0 -75
- package/native-src/src/chained_send_buffer.h +0 -137
- package/native-src/src/crypto/hkdf.c +0 -266
- package/native-src/src/crypto/poly1305.h +0 -36
- package/native-src/src/dht.cpp +0 -3311
- package/native-src/src/dht.h +0 -717
- package/native-src/src/disk_io.cpp +0 -632
- package/native-src/src/disk_io.h +0 -315
- package/native-src/src/file_transfer.cpp +0 -1415
- package/native-src/src/file_transfer.h +0 -286
- package/native-src/src/fs.h +0 -108
- package/native-src/src/gossipsub.cpp +0 -1139
- package/native-src/src/gossipsub.h +0 -403
- package/native-src/src/ice.cpp +0 -893
- package/native-src/src/ice.h +0 -559
- package/native-src/src/json.hpp +0 -25526
- package/native-src/src/librats.cpp +0 -2378
- package/native-src/src/librats.h +0 -2324
- package/native-src/src/librats_bittorrent.cpp +0 -601
- package/native-src/src/librats_c.cpp +0 -1557
- package/native-src/src/librats_c.h +0 -323
- package/native-src/src/librats_discovery.cpp +0 -402
- package/native-src/src/librats_encryption.cpp +0 -275
- package/native-src/src/librats_file_transfer.cpp +0 -144
- package/native-src/src/librats_gossipsub.cpp +0 -289
- package/native-src/src/librats_ice.cpp +0 -213
- package/native-src/src/librats_log_macros.h +0 -36
- package/native-src/src/librats_logging.cpp +0 -173
- package/native-src/src/librats_mdns.cpp +0 -166
- package/native-src/src/librats_persistence.cpp +0 -796
- package/native-src/src/librats_portmap.cpp +0 -419
- package/native-src/src/librats_reconnection.cpp +0 -218
- package/native-src/src/librats_statistic.cpp +0 -105
- package/native-src/src/librats_storage.cpp +0 -189
- package/native-src/src/rats_export.h +0 -17
- package/native-src/src/receive_buffer.cpp +0 -82
- package/native-src/src/receive_buffer.h +0 -127
- package/native-src/src/socket.h +0 -228
- package/native-src/src/threadmanager.cpp +0 -105
- package/native-src/src/threadmanager.h +0 -53
- package/native-src/src/tracker.cpp +0 -1264
- package/native-src/src/tracker.h +0 -319
- package/native-src/src/turn.cpp +0 -762
- package/native-src/src/turn.h +0 -460
- package/native-src/src/wakeup_pipe.h +0 -60
- /package/native-src/src/{os.h → librats/util/os.h} +0 -0
|
@@ -1,445 +0,0 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @file bt_client.h
|
|
5
|
-
* @brief BitTorrent client manager
|
|
6
|
-
*
|
|
7
|
-
* High-level interface for managing multiple torrents,
|
|
8
|
-
* listening for connections, and coordinating DHT/trackers.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
#include "bt_types.h"
|
|
12
|
-
#include "bt_torrent.h"
|
|
13
|
-
#include "bt_torrent_info.h"
|
|
14
|
-
#include "bt_resume_data.h"
|
|
15
|
-
#include "bt_network.h"
|
|
16
|
-
#include "dht.h"
|
|
17
|
-
|
|
18
|
-
#include <memory>
|
|
19
|
-
#include <vector>
|
|
20
|
-
#include <unordered_map>
|
|
21
|
-
#include <mutex>
|
|
22
|
-
#include <atomic>
|
|
23
|
-
#include <functional>
|
|
24
|
-
#include <thread>
|
|
25
|
-
|
|
26
|
-
namespace librats {
|
|
27
|
-
|
|
28
|
-
// Forward declarations
|
|
29
|
-
class TrackerManager;
|
|
30
|
-
|
|
31
|
-
//=============================================================================
|
|
32
|
-
// Client Configuration
|
|
33
|
-
//=============================================================================
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* @brief Configuration for the BitTorrent client
|
|
37
|
-
*/
|
|
38
|
-
struct BtClientConfig {
|
|
39
|
-
std::string download_path; ///< Default download directory
|
|
40
|
-
std::string resume_data_path; ///< Directory for resume data files (if empty, uses download_path)
|
|
41
|
-
uint16_t listen_port; ///< Port for incoming connections (0 = random)
|
|
42
|
-
size_t max_connections; ///< Global max connections
|
|
43
|
-
size_t max_connections_per_torrent; ///< Max connections per torrent
|
|
44
|
-
size_t max_uploads; ///< Max upload slots per torrent
|
|
45
|
-
uint64_t download_limit; ///< Global download limit (bytes/sec, 0 = unlimited)
|
|
46
|
-
uint64_t upload_limit; ///< Global upload limit (bytes/sec, 0 = unlimited)
|
|
47
|
-
bool enable_dht; ///< Enable DHT
|
|
48
|
-
bool enable_pex; ///< Enable peer exchange
|
|
49
|
-
bool enable_lsd; ///< Enable local service discovery
|
|
50
|
-
std::string user_agent; ///< Client user agent string
|
|
51
|
-
|
|
52
|
-
BtClientConfig()
|
|
53
|
-
: listen_port(6881)
|
|
54
|
-
, max_connections(200)
|
|
55
|
-
, max_connections_per_torrent(50)
|
|
56
|
-
, max_uploads(4)
|
|
57
|
-
, download_limit(0)
|
|
58
|
-
, upload_limit(0)
|
|
59
|
-
, enable_dht(true)
|
|
60
|
-
, enable_pex(true)
|
|
61
|
-
, enable_lsd(true)
|
|
62
|
-
, user_agent("librats/1.0") {}
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
//=============================================================================
|
|
66
|
-
// BitTorrent Client
|
|
67
|
-
//=============================================================================
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* @brief High-level BitTorrent client
|
|
71
|
-
*
|
|
72
|
-
* Manages:
|
|
73
|
-
* - Multiple torrents
|
|
74
|
-
* - Incoming peer connections
|
|
75
|
-
* - DHT node
|
|
76
|
-
* - Tracker management
|
|
77
|
-
* - Global rate limiting
|
|
78
|
-
*
|
|
79
|
-
* Thread-safe: All public methods are protected.
|
|
80
|
-
*/
|
|
81
|
-
class BtClient {
|
|
82
|
-
public:
|
|
83
|
-
//=========================================================================
|
|
84
|
-
// Types
|
|
85
|
-
//=========================================================================
|
|
86
|
-
|
|
87
|
-
using TorrentAddedCallback = std::function<void(Torrent::Ptr)>;
|
|
88
|
-
using TorrentRemovedCallback = std::function<void(const BtInfoHash&)>;
|
|
89
|
-
using AlertCallback = std::function<void(const std::string&)>;
|
|
90
|
-
|
|
91
|
-
//=========================================================================
|
|
92
|
-
// Construction
|
|
93
|
-
//=========================================================================
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* @brief Create a client with default config
|
|
97
|
-
*/
|
|
98
|
-
BtClient();
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* @brief Create a client with custom config
|
|
102
|
-
*/
|
|
103
|
-
explicit BtClient(const BtClientConfig& config);
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* @brief Destructor - stops all torrents
|
|
107
|
-
*/
|
|
108
|
-
~BtClient();
|
|
109
|
-
|
|
110
|
-
// Non-copyable
|
|
111
|
-
BtClient(const BtClient&) = delete;
|
|
112
|
-
BtClient& operator=(const BtClient&) = delete;
|
|
113
|
-
|
|
114
|
-
//=========================================================================
|
|
115
|
-
// Lifecycle
|
|
116
|
-
//=========================================================================
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* @brief Start the client
|
|
120
|
-
*
|
|
121
|
-
* Begins listening for connections and starts DHT if enabled.
|
|
122
|
-
*/
|
|
123
|
-
void start();
|
|
124
|
-
|
|
125
|
-
/**
|
|
126
|
-
* @brief Stop the client
|
|
127
|
-
*
|
|
128
|
-
* Stops all torrents and closes connections.
|
|
129
|
-
*/
|
|
130
|
-
void stop();
|
|
131
|
-
|
|
132
|
-
/**
|
|
133
|
-
* @brief Check if client is running
|
|
134
|
-
*/
|
|
135
|
-
bool is_running() const { return running_; }
|
|
136
|
-
|
|
137
|
-
//=========================================================================
|
|
138
|
-
// Torrent Management
|
|
139
|
-
//=========================================================================
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* @brief Set the resume data path for all new torrents
|
|
143
|
-
*
|
|
144
|
-
* @param path Directory where resume data files will be stored
|
|
145
|
-
*/
|
|
146
|
-
void set_resume_data_path(const std::string& path);
|
|
147
|
-
|
|
148
|
-
/**
|
|
149
|
-
* @brief Add a torrent from a .torrent file
|
|
150
|
-
*
|
|
151
|
-
* @param path Path to .torrent file
|
|
152
|
-
* @param save_path Directory to save files (empty = use default)
|
|
153
|
-
* @return Torrent pointer, or nullptr on failure
|
|
154
|
-
*/
|
|
155
|
-
Torrent::Ptr add_torrent_file(const std::string& path,
|
|
156
|
-
const std::string& save_path = "");
|
|
157
|
-
|
|
158
|
-
/**
|
|
159
|
-
* @brief Add a torrent from TorrentInfo
|
|
160
|
-
*
|
|
161
|
-
* @param info Torrent metadata
|
|
162
|
-
* @param save_path Directory to save files
|
|
163
|
-
* @return Torrent pointer
|
|
164
|
-
*/
|
|
165
|
-
Torrent::Ptr add_torrent(const TorrentInfo& info,
|
|
166
|
-
const std::string& save_path = "");
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* @brief Add a torrent from magnet link
|
|
170
|
-
*
|
|
171
|
-
* @param magnet_uri Magnet URI
|
|
172
|
-
* @param save_path Directory to save files
|
|
173
|
-
* @param skip_dht_search If true, don't search DHT for peers (for metadata-only from specific peer)
|
|
174
|
-
* @return Torrent pointer, or nullptr on failure
|
|
175
|
-
*/
|
|
176
|
-
Torrent::Ptr add_magnet(const std::string& magnet_uri,
|
|
177
|
-
const std::string& save_path = "",
|
|
178
|
-
bool skip_dht_search = false);
|
|
179
|
-
|
|
180
|
-
/**
|
|
181
|
-
* @brief Add a torrent with resume data for fast resume
|
|
182
|
-
*
|
|
183
|
-
* @param info Torrent metadata
|
|
184
|
-
* @param resume_data Resume data from previous session
|
|
185
|
-
* @param save_path Directory to save files (uses resume_data.save_path if empty)
|
|
186
|
-
* @return Torrent pointer
|
|
187
|
-
*/
|
|
188
|
-
Torrent::Ptr add_torrent_with_resume(
|
|
189
|
-
const TorrentInfo& info,
|
|
190
|
-
const TorrentResumeData& resume_data,
|
|
191
|
-
const std::string& save_path = "");
|
|
192
|
-
|
|
193
|
-
/**
|
|
194
|
-
* @brief Add a torrent and try to load resume data automatically
|
|
195
|
-
*
|
|
196
|
-
* Looks for resume data in {save_path}/.resume/{info_hash}.resume
|
|
197
|
-
* If found, applies it for fast resume. Otherwise, starts fresh.
|
|
198
|
-
*
|
|
199
|
-
* @param info Torrent metadata
|
|
200
|
-
* @param save_path Directory to save files
|
|
201
|
-
* @param check_files If true and no resume data, verify existing files
|
|
202
|
-
* @return Torrent pointer
|
|
203
|
-
*/
|
|
204
|
-
Torrent::Ptr add_torrent_auto_resume(
|
|
205
|
-
const TorrentInfo& info,
|
|
206
|
-
const std::string& save_path = "",
|
|
207
|
-
bool check_files = true);
|
|
208
|
-
|
|
209
|
-
/**
|
|
210
|
-
* @brief Add a torrent for seeding (seed_mode)
|
|
211
|
-
*
|
|
212
|
-
* Use this when you have created a torrent from existing files and want to
|
|
213
|
-
* start seeding immediately. All pieces are assumed to be complete.
|
|
214
|
-
*
|
|
215
|
-
* This is the correct method to use after create_torrent_from_path().
|
|
216
|
-
*
|
|
217
|
-
* @param info Torrent metadata (from create_torrent_from_path or similar)
|
|
218
|
-
* @param save_path Directory where files are located
|
|
219
|
-
* @return Torrent pointer
|
|
220
|
-
*/
|
|
221
|
-
Torrent::Ptr add_torrent_for_seeding(
|
|
222
|
-
const TorrentInfo& info,
|
|
223
|
-
const std::string& save_path);
|
|
224
|
-
|
|
225
|
-
/**
|
|
226
|
-
* @brief Save resume data for all active torrents
|
|
227
|
-
*
|
|
228
|
-
* Call this periodically or before shutdown to save progress.
|
|
229
|
-
*/
|
|
230
|
-
void save_all_resume_data();
|
|
231
|
-
|
|
232
|
-
/**
|
|
233
|
-
* @brief Remove a torrent
|
|
234
|
-
*
|
|
235
|
-
* @param info_hash Info hash of torrent to remove
|
|
236
|
-
* @param delete_files Also delete downloaded files
|
|
237
|
-
*/
|
|
238
|
-
void remove_torrent(const BtInfoHash& info_hash, bool delete_files = false);
|
|
239
|
-
|
|
240
|
-
/**
|
|
241
|
-
* @brief Mark a torrent for deferred removal
|
|
242
|
-
*
|
|
243
|
-
* Thread-safe method that can be called from any thread/callback.
|
|
244
|
-
* The actual removal happens in the tick loop to avoid deadlocks.
|
|
245
|
-
*
|
|
246
|
-
* @param info_hash Info hash of torrent to remove
|
|
247
|
-
*/
|
|
248
|
-
void mark_for_removal(const BtInfoHash& info_hash);
|
|
249
|
-
|
|
250
|
-
/**
|
|
251
|
-
* @brief Get a torrent by info hash
|
|
252
|
-
*/
|
|
253
|
-
Torrent::Ptr get_torrent(const BtInfoHash& info_hash);
|
|
254
|
-
|
|
255
|
-
/**
|
|
256
|
-
* @brief Get all torrents
|
|
257
|
-
*/
|
|
258
|
-
std::vector<Torrent::Ptr> get_torrents();
|
|
259
|
-
|
|
260
|
-
/**
|
|
261
|
-
* @brief Get number of torrents
|
|
262
|
-
*/
|
|
263
|
-
size_t num_torrents() const;
|
|
264
|
-
|
|
265
|
-
//=========================================================================
|
|
266
|
-
// Configuration
|
|
267
|
-
//=========================================================================
|
|
268
|
-
|
|
269
|
-
/**
|
|
270
|
-
* @brief Get current configuration
|
|
271
|
-
*/
|
|
272
|
-
const BtClientConfig& config() const { return config_; }
|
|
273
|
-
|
|
274
|
-
/**
|
|
275
|
-
* @brief Set global download limit
|
|
276
|
-
*/
|
|
277
|
-
void set_download_limit(uint64_t bytes_per_sec);
|
|
278
|
-
|
|
279
|
-
/**
|
|
280
|
-
* @brief Set global upload limit
|
|
281
|
-
*/
|
|
282
|
-
void set_upload_limit(uint64_t bytes_per_sec);
|
|
283
|
-
|
|
284
|
-
/**
|
|
285
|
-
* @brief Get our peer ID
|
|
286
|
-
*/
|
|
287
|
-
const PeerID& peer_id() const { return peer_id_; }
|
|
288
|
-
|
|
289
|
-
/**
|
|
290
|
-
* @brief Get listen port (actual port when running, configured port otherwise)
|
|
291
|
-
*/
|
|
292
|
-
uint16_t listen_port() const {
|
|
293
|
-
if (network_manager_ && network_manager_->is_running()) {
|
|
294
|
-
return network_manager_->listen_port();
|
|
295
|
-
}
|
|
296
|
-
return config_.listen_port;
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
//=========================================================================
|
|
300
|
-
// Callbacks
|
|
301
|
-
//=========================================================================
|
|
302
|
-
|
|
303
|
-
void set_torrent_added_callback(TorrentAddedCallback cb) {
|
|
304
|
-
on_torrent_added_ = std::move(cb);
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
void set_torrent_removed_callback(TorrentRemovedCallback cb) {
|
|
308
|
-
on_torrent_removed_ = std::move(cb);
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
void set_alert_callback(AlertCallback cb) {
|
|
312
|
-
on_alert_ = std::move(cb);
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
//=========================================================================
|
|
316
|
-
// Statistics
|
|
317
|
-
//=========================================================================
|
|
318
|
-
|
|
319
|
-
/**
|
|
320
|
-
* @brief Get total download rate (all torrents)
|
|
321
|
-
*/
|
|
322
|
-
uint64_t total_download_rate() const;
|
|
323
|
-
|
|
324
|
-
/**
|
|
325
|
-
* @brief Get total upload rate (all torrents)
|
|
326
|
-
*/
|
|
327
|
-
uint64_t total_upload_rate() const;
|
|
328
|
-
|
|
329
|
-
/**
|
|
330
|
-
* @brief Get total connected peers
|
|
331
|
-
*/
|
|
332
|
-
size_t total_peers() const;
|
|
333
|
-
|
|
334
|
-
//=========================================================================
|
|
335
|
-
// DHT
|
|
336
|
-
//=========================================================================
|
|
337
|
-
|
|
338
|
-
/**
|
|
339
|
-
* @brief Check if DHT is running
|
|
340
|
-
*/
|
|
341
|
-
bool dht_running() const { return dht_running_; }
|
|
342
|
-
|
|
343
|
-
/**
|
|
344
|
-
* @brief Set an external DHT client to use instead of creating one
|
|
345
|
-
*
|
|
346
|
-
* Must be called before start(). The external DHT client's lifecycle
|
|
347
|
-
* is managed by the caller - BtClient will not start or stop it.
|
|
348
|
-
*
|
|
349
|
-
* @param dht External DHT client (must remain valid while BtClient is running)
|
|
350
|
-
*/
|
|
351
|
-
void set_external_dht(DhtClient* dht);
|
|
352
|
-
|
|
353
|
-
/**
|
|
354
|
-
* @brief Get the DHT client (internal or external)
|
|
355
|
-
*/
|
|
356
|
-
DhtClient* get_dht_client() { return external_dht_ ? external_dht_ : dht_client_.get(); }
|
|
357
|
-
|
|
358
|
-
/**
|
|
359
|
-
* @brief Add DHT bootstrap node
|
|
360
|
-
*/
|
|
361
|
-
void add_dht_node(const std::string& host, uint16_t port);
|
|
362
|
-
|
|
363
|
-
/**
|
|
364
|
-
* @brief Get DHT node count
|
|
365
|
-
*/
|
|
366
|
-
size_t dht_node_count() const;
|
|
367
|
-
|
|
368
|
-
/**
|
|
369
|
-
* @brief Announce torrent to DHT
|
|
370
|
-
*/
|
|
371
|
-
void announce_to_dht(const BtInfoHash& info_hash);
|
|
372
|
-
|
|
373
|
-
/**
|
|
374
|
-
* @brief Find peers for torrent via DHT
|
|
375
|
-
*/
|
|
376
|
-
void find_peers_dht(const BtInfoHash& info_hash);
|
|
377
|
-
|
|
378
|
-
//=========================================================================
|
|
379
|
-
// Network
|
|
380
|
-
//=========================================================================
|
|
381
|
-
|
|
382
|
-
/**
|
|
383
|
-
* @brief Get the network manager
|
|
384
|
-
*/
|
|
385
|
-
BtNetworkManager* network_manager() { return network_manager_.get(); }
|
|
386
|
-
|
|
387
|
-
private:
|
|
388
|
-
//=========================================================================
|
|
389
|
-
// Internal Methods
|
|
390
|
-
//=========================================================================
|
|
391
|
-
|
|
392
|
-
void tick_loop();
|
|
393
|
-
Torrent::Ptr create_torrent(const TorrentInfo& info, const std::string& save_path);
|
|
394
|
-
void on_dht_peers_found(const std::vector<Peer>& peers, const InfoHash& info_hash);
|
|
395
|
-
void on_peer_connected(const BtInfoHash& info_hash,
|
|
396
|
-
std::shared_ptr<BtPeerConnection> connection,
|
|
397
|
-
socket_t socket, bool is_incoming);
|
|
398
|
-
void on_peer_disconnected(const BtInfoHash& info_hash, BtPeerConnection* connection);
|
|
399
|
-
void on_peer_data(const BtInfoHash& info_hash, BtPeerConnection* connection, socket_t socket);
|
|
400
|
-
void connect_pending_peers();
|
|
401
|
-
void announce_torrents_to_trackers();
|
|
402
|
-
|
|
403
|
-
//=========================================================================
|
|
404
|
-
// Data Members
|
|
405
|
-
//=========================================================================
|
|
406
|
-
|
|
407
|
-
mutable std::mutex mutex_;
|
|
408
|
-
|
|
409
|
-
BtClientConfig config_;
|
|
410
|
-
PeerID peer_id_;
|
|
411
|
-
|
|
412
|
-
std::atomic<bool> running_;
|
|
413
|
-
std::atomic<bool> dht_running_;
|
|
414
|
-
|
|
415
|
-
std::unordered_map<BtInfoHash, Torrent::Ptr, InfoHashHash> torrents_;
|
|
416
|
-
|
|
417
|
-
std::thread tick_thread_;
|
|
418
|
-
|
|
419
|
-
// DHT client (owned, if not using external)
|
|
420
|
-
std::unique_ptr<DhtClient> dht_client_;
|
|
421
|
-
|
|
422
|
-
// External DHT client (non-owning pointer, lifecycle managed externally)
|
|
423
|
-
DhtClient* external_dht_ = nullptr;
|
|
424
|
-
|
|
425
|
-
// Network manager
|
|
426
|
-
std::unique_ptr<BtNetworkManager> network_manager_;
|
|
427
|
-
|
|
428
|
-
// Tracker managers per torrent
|
|
429
|
-
std::unordered_map<BtInfoHash, std::unique_ptr<TrackerManager>, InfoHashHash> tracker_managers_;
|
|
430
|
-
|
|
431
|
-
// Announce timing
|
|
432
|
-
std::chrono::steady_clock::time_point last_dht_announce_;
|
|
433
|
-
std::chrono::steady_clock::time_point last_tracker_announce_;
|
|
434
|
-
|
|
435
|
-
// Deferred removal queue (thread-safe, processed in tick_loop)
|
|
436
|
-
mutable std::mutex removal_mutex_;
|
|
437
|
-
std::vector<BtInfoHash> pending_removals_;
|
|
438
|
-
|
|
439
|
-
// Callbacks
|
|
440
|
-
TorrentAddedCallback on_torrent_added_;
|
|
441
|
-
TorrentRemovedCallback on_torrent_removed_;
|
|
442
|
-
AlertCallback on_alert_;
|
|
443
|
-
};
|
|
444
|
-
|
|
445
|
-
} // namespace librats
|