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,592 +0,0 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @file bt_peer_connection.h
|
|
5
|
-
* @brief BitTorrent peer connection management
|
|
6
|
-
*
|
|
7
|
-
* Handles TCP connections to peers, message buffering, and state management.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
#include "bt_types.h"
|
|
11
|
-
#include "bt_bitfield.h"
|
|
12
|
-
#include "bt_messages.h"
|
|
13
|
-
#include "bt_handshake.h"
|
|
14
|
-
#include "receive_buffer.h"
|
|
15
|
-
#include "chained_send_buffer.h"
|
|
16
|
-
|
|
17
|
-
#include <vector>
|
|
18
|
-
#include <queue>
|
|
19
|
-
#include <chrono>
|
|
20
|
-
#include <functional>
|
|
21
|
-
#include <memory>
|
|
22
|
-
#include <mutex>
|
|
23
|
-
#include <atomic>
|
|
24
|
-
#include <optional>
|
|
25
|
-
#include <algorithm>
|
|
26
|
-
|
|
27
|
-
namespace librats {
|
|
28
|
-
|
|
29
|
-
//=============================================================================
|
|
30
|
-
// Connection State
|
|
31
|
-
//=============================================================================
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* @brief State of a peer connection
|
|
35
|
-
*/
|
|
36
|
-
enum class PeerConnectionState : uint8_t {
|
|
37
|
-
Disconnected, ///< Not connected
|
|
38
|
-
Connecting, ///< TCP connection in progress
|
|
39
|
-
Handshaking, ///< Waiting for handshake
|
|
40
|
-
Connected, ///< Connected and ready
|
|
41
|
-
Closing ///< Connection closing
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* @brief Convert state to string
|
|
46
|
-
*/
|
|
47
|
-
const char* peer_state_to_string(PeerConnectionState state);
|
|
48
|
-
|
|
49
|
-
//=============================================================================
|
|
50
|
-
// Peer Statistics
|
|
51
|
-
//=============================================================================
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* @brief Statistics for a peer connection
|
|
55
|
-
*/
|
|
56
|
-
struct PeerStats {
|
|
57
|
-
uint64_t bytes_downloaded; ///< Total bytes downloaded from peer
|
|
58
|
-
uint64_t bytes_uploaded; ///< Total bytes uploaded to peer
|
|
59
|
-
uint32_t pieces_received; ///< Number of pieces received
|
|
60
|
-
uint32_t pieces_sent; ///< Number of pieces sent
|
|
61
|
-
uint32_t messages_received; ///< Total messages received
|
|
62
|
-
uint32_t messages_sent; ///< Total messages sent
|
|
63
|
-
|
|
64
|
-
std::chrono::steady_clock::time_point connected_at;
|
|
65
|
-
std::chrono::steady_clock::time_point last_message_at;
|
|
66
|
-
std::chrono::steady_clock::time_point last_piece_at;
|
|
67
|
-
|
|
68
|
-
PeerStats()
|
|
69
|
-
: bytes_downloaded(0), bytes_uploaded(0)
|
|
70
|
-
, pieces_received(0), pieces_sent(0)
|
|
71
|
-
, messages_received(0), messages_sent(0) {}
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* @brief Calculate download speed (bytes/sec over last interval)
|
|
75
|
-
*/
|
|
76
|
-
double download_rate() const;
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* @brief Calculate upload speed (bytes/sec over last interval)
|
|
80
|
-
*/
|
|
81
|
-
double upload_rate() const;
|
|
82
|
-
};
|
|
83
|
-
|
|
84
|
-
//=============================================================================
|
|
85
|
-
// Peer Connection
|
|
86
|
-
//=============================================================================
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* @brief Represents a connection to a BitTorrent peer
|
|
90
|
-
*
|
|
91
|
-
* This class manages:
|
|
92
|
-
* - TCP connection state
|
|
93
|
-
* - Handshake exchange
|
|
94
|
-
* - Message buffering and parsing
|
|
95
|
-
* - Choking/interest state
|
|
96
|
-
* - Pending block requests
|
|
97
|
-
*
|
|
98
|
-
* Thread-safety: Most methods require external synchronization.
|
|
99
|
-
* The connection uses callbacks for received data/messages.
|
|
100
|
-
*/
|
|
101
|
-
class BtPeerConnection {
|
|
102
|
-
public:
|
|
103
|
-
//=========================================================================
|
|
104
|
-
// Types
|
|
105
|
-
//=========================================================================
|
|
106
|
-
|
|
107
|
-
/// Callback for received messages
|
|
108
|
-
using MessageCallback = std::function<void(BtPeerConnection*, const BtMessage&)>;
|
|
109
|
-
|
|
110
|
-
/// Callback for connection state changes
|
|
111
|
-
using StateCallback = std::function<void(BtPeerConnection*, PeerConnectionState)>;
|
|
112
|
-
|
|
113
|
-
/// Callback for handshake completion
|
|
114
|
-
using HandshakeCallback = std::function<void(BtPeerConnection*, const Handshake&)>;
|
|
115
|
-
|
|
116
|
-
/// Callback for errors
|
|
117
|
-
using ErrorCallback = std::function<void(BtPeerConnection*, const std::string&)>;
|
|
118
|
-
|
|
119
|
-
/// Callback when info_hash is discovered (for incoming connections)
|
|
120
|
-
using InfoHashCallback = std::function<void(BtPeerConnection*, const BtInfoHash&)>;
|
|
121
|
-
|
|
122
|
-
//=========================================================================
|
|
123
|
-
// Construction
|
|
124
|
-
//=========================================================================
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* @brief Create a peer connection (outgoing - info_hash known)
|
|
128
|
-
*
|
|
129
|
-
* @param info_hash Our info hash
|
|
130
|
-
* @param our_peer_id Our peer ID
|
|
131
|
-
* @param num_pieces Number of pieces in torrent
|
|
132
|
-
*/
|
|
133
|
-
BtPeerConnection(const BtInfoHash& info_hash,
|
|
134
|
-
const PeerID& our_peer_id,
|
|
135
|
-
uint32_t num_pieces);
|
|
136
|
-
|
|
137
|
-
/**
|
|
138
|
-
* @brief Create a peer connection (incoming - info_hash unknown until handshake)
|
|
139
|
-
*
|
|
140
|
-
* For incoming connections, we don't know which torrent the peer wants
|
|
141
|
-
* until we receive their handshake. Use set_torrent_info() after handshake.
|
|
142
|
-
*
|
|
143
|
-
* @param our_peer_id Our peer ID
|
|
144
|
-
*/
|
|
145
|
-
explicit BtPeerConnection(const PeerID& our_peer_id);
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* @brief Destructor
|
|
149
|
-
*/
|
|
150
|
-
~BtPeerConnection();
|
|
151
|
-
|
|
152
|
-
//=========================================================================
|
|
153
|
-
// Static Helpers
|
|
154
|
-
//=========================================================================
|
|
155
|
-
|
|
156
|
-
// Non-copyable
|
|
157
|
-
BtPeerConnection(const BtPeerConnection&) = delete;
|
|
158
|
-
BtPeerConnection& operator=(const BtPeerConnection&) = delete;
|
|
159
|
-
|
|
160
|
-
// Movable
|
|
161
|
-
BtPeerConnection(BtPeerConnection&&) noexcept;
|
|
162
|
-
BtPeerConnection& operator=(BtPeerConnection&&) noexcept;
|
|
163
|
-
|
|
164
|
-
//=========================================================================
|
|
165
|
-
// Connection Management
|
|
166
|
-
//=========================================================================
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* @brief Set the socket descriptor (after successful connect)
|
|
170
|
-
*/
|
|
171
|
-
void set_socket(int socket_fd);
|
|
172
|
-
|
|
173
|
-
/**
|
|
174
|
-
* @brief Get the socket descriptor
|
|
175
|
-
*/
|
|
176
|
-
int socket() const { return socket_fd_; }
|
|
177
|
-
|
|
178
|
-
/**
|
|
179
|
-
* @brief Set peer address for identification
|
|
180
|
-
*/
|
|
181
|
-
void set_address(const std::string& ip, uint16_t port);
|
|
182
|
-
|
|
183
|
-
/**
|
|
184
|
-
* @brief Get peer IP address
|
|
185
|
-
*/
|
|
186
|
-
const std::string& ip() const { return ip_; }
|
|
187
|
-
|
|
188
|
-
/**
|
|
189
|
-
* @brief Get peer port
|
|
190
|
-
*/
|
|
191
|
-
uint16_t port() const { return port_; }
|
|
192
|
-
|
|
193
|
-
/**
|
|
194
|
-
* @brief Get connection state
|
|
195
|
-
*/
|
|
196
|
-
PeerConnectionState state() const { return state_; }
|
|
197
|
-
|
|
198
|
-
/**
|
|
199
|
-
* @brief Check if connected and ready
|
|
200
|
-
*/
|
|
201
|
-
bool is_connected() const { return state_ == PeerConnectionState::Connected; }
|
|
202
|
-
|
|
203
|
-
/**
|
|
204
|
-
* @brief Start handshake (send our handshake)
|
|
205
|
-
*/
|
|
206
|
-
void start_handshake();
|
|
207
|
-
|
|
208
|
-
/**
|
|
209
|
-
* @brief Close the connection
|
|
210
|
-
*/
|
|
211
|
-
void close();
|
|
212
|
-
|
|
213
|
-
/**
|
|
214
|
-
* @brief Check if info_hash is known (false for incoming before handshake)
|
|
215
|
-
*/
|
|
216
|
-
bool has_info_hash() const { return info_hash_known_; }
|
|
217
|
-
|
|
218
|
-
/**
|
|
219
|
-
* @brief Get our info hash
|
|
220
|
-
*/
|
|
221
|
-
const BtInfoHash& our_info_hash() const { return our_info_hash_; }
|
|
222
|
-
|
|
223
|
-
/**
|
|
224
|
-
* @brief Set torrent info after handshake received (for incoming connections)
|
|
225
|
-
*
|
|
226
|
-
* Called by NetworkManager after routing incoming connection to correct torrent.
|
|
227
|
-
*
|
|
228
|
-
* @param info_hash The info hash from handshake
|
|
229
|
-
* @param num_pieces Number of pieces in torrent
|
|
230
|
-
*/
|
|
231
|
-
void set_torrent_info(const BtInfoHash& info_hash, uint32_t num_pieces);
|
|
232
|
-
|
|
233
|
-
//=========================================================================
|
|
234
|
-
// Buffer Access (for NetworkManager)
|
|
235
|
-
//=========================================================================
|
|
236
|
-
|
|
237
|
-
/**
|
|
238
|
-
* @brief Get receive buffer for direct recv() operations
|
|
239
|
-
*
|
|
240
|
-
* NetworkManager should:
|
|
241
|
-
* 1. recv_buffer().ensure_space(bytes)
|
|
242
|
-
* 2. recv(socket, recv_buffer().write_ptr(), recv_buffer().write_space())
|
|
243
|
-
* 3. recv_buffer().received(bytes)
|
|
244
|
-
* 4. process_incoming()
|
|
245
|
-
*/
|
|
246
|
-
ReceiveBuffer& recv_buffer() { return recv_buffer_; }
|
|
247
|
-
const ReceiveBuffer& recv_buffer() const { return recv_buffer_; }
|
|
248
|
-
|
|
249
|
-
/**
|
|
250
|
-
* @brief Get send buffer for direct send() operations
|
|
251
|
-
*
|
|
252
|
-
* NetworkManager should:
|
|
253
|
-
* 1. Check !send_buffer().empty()
|
|
254
|
-
* 2. send(socket, send_buffer().front_data(), send_buffer().front_size())
|
|
255
|
-
* 3. send_buffer().pop_front(bytes_sent)
|
|
256
|
-
*/
|
|
257
|
-
ChainedSendBuffer& send_buffer() { return send_buffer_; }
|
|
258
|
-
const ChainedSendBuffer& send_buffer() const { return send_buffer_; }
|
|
259
|
-
|
|
260
|
-
//=========================================================================
|
|
261
|
-
// Data Processing
|
|
262
|
-
//=========================================================================
|
|
263
|
-
|
|
264
|
-
/**
|
|
265
|
-
* @brief Process data in receive buffer
|
|
266
|
-
*
|
|
267
|
-
* Call this after data has been received into recv_buffer().
|
|
268
|
-
* Parses handshake and messages, invokes callbacks.
|
|
269
|
-
*/
|
|
270
|
-
void process_incoming();
|
|
271
|
-
|
|
272
|
-
//=========================================================================
|
|
273
|
-
// Callbacks
|
|
274
|
-
//=========================================================================
|
|
275
|
-
|
|
276
|
-
void set_message_callback(MessageCallback cb) { on_message_ = std::move(cb); }
|
|
277
|
-
void set_state_callback(StateCallback cb) { on_state_change_ = std::move(cb); }
|
|
278
|
-
void set_handshake_callback(HandshakeCallback cb) { on_handshake_ = std::move(cb); }
|
|
279
|
-
void set_error_callback(ErrorCallback cb) { on_error_ = std::move(cb); }
|
|
280
|
-
void set_info_hash_callback(InfoHashCallback cb) { on_info_hash_ = std::move(cb); }
|
|
281
|
-
|
|
282
|
-
//=========================================================================
|
|
283
|
-
// Protocol State
|
|
284
|
-
//=========================================================================
|
|
285
|
-
|
|
286
|
-
/**
|
|
287
|
-
* @brief Check if we are choking the peer
|
|
288
|
-
*/
|
|
289
|
-
bool am_choking() const { return am_choking_; }
|
|
290
|
-
|
|
291
|
-
/**
|
|
292
|
-
* @brief Check if we are interested in the peer
|
|
293
|
-
*/
|
|
294
|
-
bool am_interested() const { return am_interested_; }
|
|
295
|
-
|
|
296
|
-
/**
|
|
297
|
-
* @brief Check if peer is choking us
|
|
298
|
-
*/
|
|
299
|
-
bool peer_choking() const { return peer_choking_; }
|
|
300
|
-
|
|
301
|
-
/**
|
|
302
|
-
* @brief Check if peer is interested in us
|
|
303
|
-
*/
|
|
304
|
-
bool peer_interested() const { return peer_interested_; }
|
|
305
|
-
|
|
306
|
-
/**
|
|
307
|
-
* @brief Get peer's have bitfield
|
|
308
|
-
*/
|
|
309
|
-
const Bitfield& peer_pieces() const { return peer_pieces_; }
|
|
310
|
-
|
|
311
|
-
/**
|
|
312
|
-
* @brief Check if peer has a specific piece
|
|
313
|
-
*/
|
|
314
|
-
bool peer_has_piece(uint32_t piece) const;
|
|
315
|
-
|
|
316
|
-
/**
|
|
317
|
-
* @brief Check if peer sent HaveAll (has all pieces)
|
|
318
|
-
*
|
|
319
|
-
* This is set when peer sends HaveAll message (Fast extension).
|
|
320
|
-
* Useful when metadata is not yet available to properly size the bitfield.
|
|
321
|
-
*/
|
|
322
|
-
bool peer_has_all() const { return peer_has_all_; }
|
|
323
|
-
|
|
324
|
-
/**
|
|
325
|
-
* @brief Get peer's info hash (from handshake)
|
|
326
|
-
*/
|
|
327
|
-
const BtInfoHash& peer_info_hash() const { return peer_info_hash_; }
|
|
328
|
-
|
|
329
|
-
/**
|
|
330
|
-
* @brief Get peer's peer ID (from handshake)
|
|
331
|
-
*/
|
|
332
|
-
const PeerID& peer_id() const { return peer_id_; }
|
|
333
|
-
|
|
334
|
-
/**
|
|
335
|
-
* @brief Get extension flags from handshake
|
|
336
|
-
*/
|
|
337
|
-
const ExtensionFlags& peer_extensions() const { return peer_extensions_; }
|
|
338
|
-
|
|
339
|
-
//=========================================================================
|
|
340
|
-
// Extension Handshake Data (stored for late callback registration)
|
|
341
|
-
//=========================================================================
|
|
342
|
-
|
|
343
|
-
/**
|
|
344
|
-
* @brief Check if we've received the peer's extension handshake
|
|
345
|
-
*/
|
|
346
|
-
bool extension_handshake_received() const { return extension_handshake_received_; }
|
|
347
|
-
|
|
348
|
-
/**
|
|
349
|
-
* @brief Get peer's metadata size (from extension handshake, 0 if not available)
|
|
350
|
-
*/
|
|
351
|
-
size_t peer_metadata_size() const { return peer_metadata_size_; }
|
|
352
|
-
|
|
353
|
-
/**
|
|
354
|
-
* @brief Get peer's ut_metadata message ID (from extension handshake, 0 if not supported)
|
|
355
|
-
*/
|
|
356
|
-
uint8_t peer_ut_metadata_id() const { return peer_ut_metadata_id_; }
|
|
357
|
-
|
|
358
|
-
/**
|
|
359
|
-
* @brief Get peer's client name (from extension handshake "v" field, or identified from peer_id)
|
|
360
|
-
*/
|
|
361
|
-
const std::string& peer_client_name() const { return peer_client_name_; }
|
|
362
|
-
|
|
363
|
-
//=========================================================================
|
|
364
|
-
// Sending Messages
|
|
365
|
-
//=========================================================================
|
|
366
|
-
|
|
367
|
-
/**
|
|
368
|
-
* @brief Send a choke message
|
|
369
|
-
*/
|
|
370
|
-
void send_choke();
|
|
371
|
-
|
|
372
|
-
/**
|
|
373
|
-
* @brief Send an unchoke message
|
|
374
|
-
*/
|
|
375
|
-
void send_unchoke();
|
|
376
|
-
|
|
377
|
-
/**
|
|
378
|
-
* @brief Send an interested message
|
|
379
|
-
*/
|
|
380
|
-
void send_interested();
|
|
381
|
-
|
|
382
|
-
/**
|
|
383
|
-
* @brief Send a not interested message
|
|
384
|
-
*/
|
|
385
|
-
void send_not_interested();
|
|
386
|
-
|
|
387
|
-
/**
|
|
388
|
-
* @brief Send a have message
|
|
389
|
-
*/
|
|
390
|
-
void send_have(uint32_t piece_index);
|
|
391
|
-
|
|
392
|
-
/**
|
|
393
|
-
* @brief Send our bitfield
|
|
394
|
-
*/
|
|
395
|
-
void send_bitfield(const Bitfield& bitfield);
|
|
396
|
-
|
|
397
|
-
/**
|
|
398
|
-
* @brief Send a request message
|
|
399
|
-
*/
|
|
400
|
-
void send_request(uint32_t piece, uint32_t begin, uint32_t length);
|
|
401
|
-
|
|
402
|
-
/**
|
|
403
|
-
* @brief Send a piece (block data)
|
|
404
|
-
*/
|
|
405
|
-
void send_piece(uint32_t piece, uint32_t begin, const uint8_t* data, size_t length);
|
|
406
|
-
|
|
407
|
-
/**
|
|
408
|
-
* @brief Send a cancel message
|
|
409
|
-
*/
|
|
410
|
-
void send_cancel(uint32_t piece, uint32_t begin, uint32_t length);
|
|
411
|
-
|
|
412
|
-
/**
|
|
413
|
-
* @brief Send a keep-alive
|
|
414
|
-
*/
|
|
415
|
-
void send_keepalive();
|
|
416
|
-
|
|
417
|
-
/**
|
|
418
|
-
* @brief Send an extended message
|
|
419
|
-
*/
|
|
420
|
-
void send_extended(uint8_t extension_id, const std::vector<uint8_t>& payload);
|
|
421
|
-
|
|
422
|
-
//=========================================================================
|
|
423
|
-
// Request Tracking
|
|
424
|
-
//=========================================================================
|
|
425
|
-
|
|
426
|
-
/**
|
|
427
|
-
* @brief Get number of pending requests to this peer
|
|
428
|
-
*/
|
|
429
|
-
size_t pending_requests() const { return pending_requests_.size(); }
|
|
430
|
-
|
|
431
|
-
/**
|
|
432
|
-
* @brief Get maximum allowed pending requests
|
|
433
|
-
*/
|
|
434
|
-
size_t max_pending_requests() const { return max_pending_requests_; }
|
|
435
|
-
|
|
436
|
-
/**
|
|
437
|
-
* @brief Set maximum pending requests
|
|
438
|
-
*/
|
|
439
|
-
void set_max_pending_requests(size_t max) { max_pending_requests_ = max; }
|
|
440
|
-
|
|
441
|
-
/**
|
|
442
|
-
* @brief Check if we can send more requests
|
|
443
|
-
*/
|
|
444
|
-
bool can_request() const {
|
|
445
|
-
return !peer_choking_ && pending_requests_.size() < max_pending_requests_;
|
|
446
|
-
}
|
|
447
|
-
|
|
448
|
-
/**
|
|
449
|
-
* @brief Add a pending request
|
|
450
|
-
*/
|
|
451
|
-
void add_pending_request(const RequestMessage& req);
|
|
452
|
-
|
|
453
|
-
/**
|
|
454
|
-
* @brief Remove a pending request (when received or cancelled)
|
|
455
|
-
*/
|
|
456
|
-
void remove_pending_request(const RequestMessage& req);
|
|
457
|
-
|
|
458
|
-
/**
|
|
459
|
-
* @brief Check if we have a pending request for a block
|
|
460
|
-
*/
|
|
461
|
-
bool has_pending_request(const RequestMessage& req) const {
|
|
462
|
-
return std::find(pending_requests_.begin(), pending_requests_.end(), req)
|
|
463
|
-
!= pending_requests_.end();
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
/**
|
|
467
|
-
* @brief Clear all pending requests
|
|
468
|
-
*/
|
|
469
|
-
void clear_pending_requests();
|
|
470
|
-
|
|
471
|
-
/**
|
|
472
|
-
* @brief Get all pending requests
|
|
473
|
-
*/
|
|
474
|
-
const std::vector<RequestMessage>& get_pending_requests() const { return pending_requests_; }
|
|
475
|
-
|
|
476
|
-
/**
|
|
477
|
-
* @brief Add an incoming request from peer (for Cancel tracking)
|
|
478
|
-
*/
|
|
479
|
-
void add_incoming_request(const RequestMessage& req) {
|
|
480
|
-
incoming_requests_.push_back(req);
|
|
481
|
-
}
|
|
482
|
-
|
|
483
|
-
/**
|
|
484
|
-
* @brief Remove an incoming request (when Cancel received or piece sent)
|
|
485
|
-
* @return true if request was found and removed
|
|
486
|
-
*/
|
|
487
|
-
bool remove_incoming_request(const RequestMessage& req) {
|
|
488
|
-
auto it = std::find(incoming_requests_.begin(), incoming_requests_.end(), req);
|
|
489
|
-
if (it != incoming_requests_.end()) {
|
|
490
|
-
incoming_requests_.erase(it);
|
|
491
|
-
return true;
|
|
492
|
-
}
|
|
493
|
-
return false;
|
|
494
|
-
}
|
|
495
|
-
|
|
496
|
-
/**
|
|
497
|
-
* @brief Check if we have a pending incoming request
|
|
498
|
-
*/
|
|
499
|
-
bool has_incoming_request(const RequestMessage& req) const {
|
|
500
|
-
return std::find(incoming_requests_.begin(), incoming_requests_.end(), req)
|
|
501
|
-
!= incoming_requests_.end();
|
|
502
|
-
}
|
|
503
|
-
|
|
504
|
-
//=========================================================================
|
|
505
|
-
// Statistics
|
|
506
|
-
//=========================================================================
|
|
507
|
-
|
|
508
|
-
/**
|
|
509
|
-
* @brief Get connection statistics
|
|
510
|
-
*/
|
|
511
|
-
const PeerStats& stats() const { return stats_; }
|
|
512
|
-
|
|
513
|
-
/**
|
|
514
|
-
* @brief Get a mutable reference to stats
|
|
515
|
-
*/
|
|
516
|
-
PeerStats& stats() { return stats_; }
|
|
517
|
-
|
|
518
|
-
private:
|
|
519
|
-
//=========================================================================
|
|
520
|
-
// Internal Methods
|
|
521
|
-
//=========================================================================
|
|
522
|
-
|
|
523
|
-
void set_state(PeerConnectionState new_state);
|
|
524
|
-
void queue_send(const std::vector<uint8_t>& data);
|
|
525
|
-
void process_handshake();
|
|
526
|
-
void process_messages();
|
|
527
|
-
void handle_message(const BtMessage& msg);
|
|
528
|
-
void parse_extension_handshake(const std::vector<uint8_t>& payload);
|
|
529
|
-
|
|
530
|
-
//=========================================================================
|
|
531
|
-
// Data Members
|
|
532
|
-
//=========================================================================
|
|
533
|
-
|
|
534
|
-
// Connection
|
|
535
|
-
int socket_fd_;
|
|
536
|
-
std::string ip_;
|
|
537
|
-
uint16_t port_;
|
|
538
|
-
std::atomic<PeerConnectionState> state_;
|
|
539
|
-
|
|
540
|
-
// Our identity
|
|
541
|
-
BtInfoHash our_info_hash_;
|
|
542
|
-
PeerID our_peer_id_;
|
|
543
|
-
uint32_t num_pieces_;
|
|
544
|
-
bool info_hash_known_; ///< True if info_hash is known (false for incoming before handshake)
|
|
545
|
-
|
|
546
|
-
// Peer identity (from handshake)
|
|
547
|
-
BtInfoHash peer_info_hash_;
|
|
548
|
-
PeerID peer_id_;
|
|
549
|
-
ExtensionFlags peer_extensions_;
|
|
550
|
-
bool handshake_received_;
|
|
551
|
-
bool handshake_sent_;
|
|
552
|
-
|
|
553
|
-
// Extension handshake data (stored for late callback registration)
|
|
554
|
-
bool extension_handshake_received_;
|
|
555
|
-
size_t peer_metadata_size_;
|
|
556
|
-
uint8_t peer_ut_metadata_id_;
|
|
557
|
-
std::string peer_client_name_; ///< Client name (from "v" field or peer_id identification)
|
|
558
|
-
|
|
559
|
-
// Protocol state
|
|
560
|
-
bool am_choking_;
|
|
561
|
-
bool am_interested_;
|
|
562
|
-
bool peer_choking_;
|
|
563
|
-
bool peer_interested_;
|
|
564
|
-
|
|
565
|
-
// Peer's pieces
|
|
566
|
-
Bitfield peer_pieces_;
|
|
567
|
-
bool peer_has_all_; ///< True if peer sent HaveAll (used when metadata not yet available)
|
|
568
|
-
bool bitfield_received_; ///< True if we've received Bitfield/HaveAll/HaveNone
|
|
569
|
-
|
|
570
|
-
// Buffers (single source of truth for I/O)
|
|
571
|
-
ReceiveBuffer recv_buffer_;
|
|
572
|
-
ChainedSendBuffer send_buffer_;
|
|
573
|
-
|
|
574
|
-
// Pending requests (our requests to peer)
|
|
575
|
-
std::vector<RequestMessage> pending_requests_;
|
|
576
|
-
size_t max_pending_requests_;
|
|
577
|
-
|
|
578
|
-
// Incoming requests (peer's requests to us) - for handling Cancel
|
|
579
|
-
std::vector<RequestMessage> incoming_requests_;
|
|
580
|
-
|
|
581
|
-
// Statistics
|
|
582
|
-
PeerStats stats_;
|
|
583
|
-
|
|
584
|
-
// Callbacks
|
|
585
|
-
MessageCallback on_message_;
|
|
586
|
-
StateCallback on_state_change_;
|
|
587
|
-
HandshakeCallback on_handshake_;
|
|
588
|
-
ErrorCallback on_error_;
|
|
589
|
-
InfoHashCallback on_info_hash_;
|
|
590
|
-
};
|
|
591
|
-
|
|
592
|
-
} // namespace librats
|