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,417 +0,0 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @file bt_network.h
|
|
5
|
-
* @brief Async network layer for BitTorrent peer connections
|
|
6
|
-
*
|
|
7
|
-
* Provides efficient multiplexed I/O for managing multiple peer connections
|
|
8
|
-
* using platform-optimal I/O polling (epoll/kqueue/WSAPoll).
|
|
9
|
-
* Buffers are owned by BtPeerConnection (single source of truth) -
|
|
10
|
-
* this class only handles socket I/O.
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
#include "bt_types.h"
|
|
14
|
-
#include "bt_peer_connection.h"
|
|
15
|
-
#include "io_poller.h"
|
|
16
|
-
#include "socket.h"
|
|
17
|
-
|
|
18
|
-
#include <vector>
|
|
19
|
-
#include <queue>
|
|
20
|
-
#include <unordered_map>
|
|
21
|
-
#include <memory>
|
|
22
|
-
#include <mutex>
|
|
23
|
-
#include <atomic>
|
|
24
|
-
#include <thread>
|
|
25
|
-
#include <functional>
|
|
26
|
-
#include <chrono>
|
|
27
|
-
|
|
28
|
-
namespace librats {
|
|
29
|
-
|
|
30
|
-
//=============================================================================
|
|
31
|
-
// Network Configuration
|
|
32
|
-
//=============================================================================
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* @brief Configuration for the network manager
|
|
36
|
-
*/
|
|
37
|
-
struct BtNetworkConfig {
|
|
38
|
-
uint16_t listen_port; ///< Port for incoming connections (0 = random)
|
|
39
|
-
size_t max_connections; ///< Maximum total connections
|
|
40
|
-
bool enable_incoming; ///< Accept incoming connections
|
|
41
|
-
int connect_timeout_ms; ///< Timeout for outgoing connections (ms)
|
|
42
|
-
int poll_timeout_ms; ///< Timeout for I/O poll (ms)
|
|
43
|
-
size_t send_buffer_high_water; ///< High water mark for send buffer
|
|
44
|
-
PeerID peer_id; ///< Our peer ID (for incoming connections)
|
|
45
|
-
|
|
46
|
-
BtNetworkConfig()
|
|
47
|
-
: listen_port(6881)
|
|
48
|
-
, max_connections(200)
|
|
49
|
-
, enable_incoming(true)
|
|
50
|
-
, connect_timeout_ms(30000)
|
|
51
|
-
, poll_timeout_ms(15)
|
|
52
|
-
, send_buffer_high_water(1024 * 1024) // 1MB
|
|
53
|
-
, peer_id{} {}
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
//=============================================================================
|
|
57
|
-
// Connection State
|
|
58
|
-
//=============================================================================
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* @brief State of a network connection
|
|
62
|
-
*/
|
|
63
|
-
enum class NetConnectionState : uint8_t {
|
|
64
|
-
Connecting, ///< TCP connect in progress
|
|
65
|
-
Handshaking, ///< Waiting for BitTorrent handshake
|
|
66
|
-
Connected, ///< Fully connected and operational
|
|
67
|
-
Closing ///< Connection being closed
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* @brief Information about a pending outgoing connection
|
|
72
|
-
*/
|
|
73
|
-
struct PendingConnect {
|
|
74
|
-
std::string ip;
|
|
75
|
-
uint16_t port;
|
|
76
|
-
BtInfoHash info_hash;
|
|
77
|
-
PeerID peer_id;
|
|
78
|
-
uint32_t num_pieces;
|
|
79
|
-
socket_t socket;
|
|
80
|
-
std::chrono::steady_clock::time_point start_time;
|
|
81
|
-
|
|
82
|
-
PendingConnect() : port(0), num_pieces(0), socket(INVALID_SOCKET_VALUE) {}
|
|
83
|
-
};
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* @brief Per-socket connection context
|
|
87
|
-
*
|
|
88
|
-
* Note: Buffers are now owned by BtPeerConnection (single source of truth).
|
|
89
|
-
* This struct only holds socket state and connection reference.
|
|
90
|
-
*/
|
|
91
|
-
struct SocketContext {
|
|
92
|
-
socket_t socket;
|
|
93
|
-
BtInfoHash info_hash;
|
|
94
|
-
std::shared_ptr<BtPeerConnection> connection;
|
|
95
|
-
NetConnectionState state;
|
|
96
|
-
bool incoming;
|
|
97
|
-
std::chrono::steady_clock::time_point connected_at;
|
|
98
|
-
std::chrono::steady_clock::time_point last_activity;
|
|
99
|
-
|
|
100
|
-
SocketContext()
|
|
101
|
-
: socket(INVALID_SOCKET_VALUE)
|
|
102
|
-
, state(NetConnectionState::Connecting)
|
|
103
|
-
, incoming(false) {}
|
|
104
|
-
};
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* @brief Per-torrent registration info
|
|
108
|
-
*/
|
|
109
|
-
struct TorrentRegistration {
|
|
110
|
-
BtInfoHash info_hash;
|
|
111
|
-
PeerID peer_id;
|
|
112
|
-
uint32_t num_pieces;
|
|
113
|
-
|
|
114
|
-
TorrentRegistration() : num_pieces(0) {}
|
|
115
|
-
};
|
|
116
|
-
|
|
117
|
-
//=============================================================================
|
|
118
|
-
// Deferred Callback Events (to avoid deadlocks)
|
|
119
|
-
//=============================================================================
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
* @brief Event for connected callback (deferred)
|
|
123
|
-
*/
|
|
124
|
-
struct ConnectedEvent {
|
|
125
|
-
BtInfoHash info_hash;
|
|
126
|
-
std::shared_ptr<BtPeerConnection> connection;
|
|
127
|
-
socket_t socket;
|
|
128
|
-
bool incoming;
|
|
129
|
-
};
|
|
130
|
-
|
|
131
|
-
/**
|
|
132
|
-
* @brief Event for data callback (deferred)
|
|
133
|
-
*/
|
|
134
|
-
struct DataEvent {
|
|
135
|
-
BtInfoHash info_hash;
|
|
136
|
-
std::shared_ptr<BtPeerConnection> connection;
|
|
137
|
-
socket_t socket;
|
|
138
|
-
};
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
* @brief Event for disconnected callback (deferred)
|
|
142
|
-
*/
|
|
143
|
-
struct DisconnectedEvent {
|
|
144
|
-
BtInfoHash info_hash;
|
|
145
|
-
std::shared_ptr<BtPeerConnection> connection;
|
|
146
|
-
};
|
|
147
|
-
|
|
148
|
-
//=============================================================================
|
|
149
|
-
// Network Manager
|
|
150
|
-
//=============================================================================
|
|
151
|
-
|
|
152
|
-
/**
|
|
153
|
-
* @brief Manages all BitTorrent peer connections
|
|
154
|
-
*
|
|
155
|
-
* Provides async I/O via platform-optimal multiplexing:
|
|
156
|
-
* - Linux: epoll (O(1) per event)
|
|
157
|
-
* - macOS: kqueue (O(1) per event)
|
|
158
|
-
* - Windows: WSAPoll (no FD_SETSIZE limit)
|
|
159
|
-
*
|
|
160
|
-
* Features:
|
|
161
|
-
* - Listens for incoming connections
|
|
162
|
-
* - Manages outgoing connection queue
|
|
163
|
-
* - Handles non-blocking reads/writes
|
|
164
|
-
* - TCP_NODELAY for low-latency messaging
|
|
165
|
-
* - Invokes callbacks for events
|
|
166
|
-
*
|
|
167
|
-
* Thread-safety: The manager runs its own I/O thread.
|
|
168
|
-
* Callbacks are invoked from the I/O thread.
|
|
169
|
-
* Public methods are thread-safe.
|
|
170
|
-
*/
|
|
171
|
-
class BtNetworkManager {
|
|
172
|
-
public:
|
|
173
|
-
//=========================================================================
|
|
174
|
-
// Types
|
|
175
|
-
//=========================================================================
|
|
176
|
-
|
|
177
|
-
/// Callback when a peer connection is established (handshake complete)
|
|
178
|
-
using ConnectedCallback = std::function<void(
|
|
179
|
-
const BtInfoHash& info_hash,
|
|
180
|
-
std::shared_ptr<BtPeerConnection> connection,
|
|
181
|
-
socket_t socket,
|
|
182
|
-
bool incoming
|
|
183
|
-
)>;
|
|
184
|
-
|
|
185
|
-
/// Callback when a peer disconnects
|
|
186
|
-
using DisconnectedCallback = std::function<void(
|
|
187
|
-
const BtInfoHash& info_hash,
|
|
188
|
-
BtPeerConnection* connection
|
|
189
|
-
)>;
|
|
190
|
-
|
|
191
|
-
/// Callback when data is received and processed
|
|
192
|
-
using DataCallback = std::function<void(
|
|
193
|
-
const BtInfoHash& info_hash,
|
|
194
|
-
BtPeerConnection* connection,
|
|
195
|
-
socket_t socket
|
|
196
|
-
)>;
|
|
197
|
-
|
|
198
|
-
//=========================================================================
|
|
199
|
-
// Construction
|
|
200
|
-
//=========================================================================
|
|
201
|
-
|
|
202
|
-
/**
|
|
203
|
-
* @brief Create network manager with config
|
|
204
|
-
*/
|
|
205
|
-
explicit BtNetworkManager(const BtNetworkConfig& config);
|
|
206
|
-
|
|
207
|
-
/**
|
|
208
|
-
* @brief Destructor - stops the manager
|
|
209
|
-
*/
|
|
210
|
-
~BtNetworkManager();
|
|
211
|
-
|
|
212
|
-
// Non-copyable
|
|
213
|
-
BtNetworkManager(const BtNetworkManager&) = delete;
|
|
214
|
-
BtNetworkManager& operator=(const BtNetworkManager&) = delete;
|
|
215
|
-
|
|
216
|
-
//=========================================================================
|
|
217
|
-
// Lifecycle
|
|
218
|
-
//=========================================================================
|
|
219
|
-
|
|
220
|
-
/**
|
|
221
|
-
* @brief Start the network manager
|
|
222
|
-
*
|
|
223
|
-
* Creates listen socket and starts I/O thread.
|
|
224
|
-
*
|
|
225
|
-
* @return true if started successfully
|
|
226
|
-
*/
|
|
227
|
-
bool start();
|
|
228
|
-
|
|
229
|
-
/**
|
|
230
|
-
* @brief Stop the network manager
|
|
231
|
-
*
|
|
232
|
-
* Closes all connections and stops I/O thread.
|
|
233
|
-
*/
|
|
234
|
-
void stop();
|
|
235
|
-
|
|
236
|
-
/**
|
|
237
|
-
* @brief Check if manager is running
|
|
238
|
-
*/
|
|
239
|
-
bool is_running() const { return running_; }
|
|
240
|
-
|
|
241
|
-
/**
|
|
242
|
-
* @brief Get the actual listen port
|
|
243
|
-
*/
|
|
244
|
-
uint16_t listen_port() const { return actual_listen_port_; }
|
|
245
|
-
|
|
246
|
-
//=========================================================================
|
|
247
|
-
// Torrent Registration
|
|
248
|
-
//=========================================================================
|
|
249
|
-
|
|
250
|
-
/**
|
|
251
|
-
* @brief Register a torrent to accept connections for
|
|
252
|
-
*
|
|
253
|
-
* @param info_hash Torrent info hash
|
|
254
|
-
* @param peer_id Our peer ID
|
|
255
|
-
* @param num_pieces Number of pieces in torrent
|
|
256
|
-
*/
|
|
257
|
-
void register_torrent(const BtInfoHash& info_hash,
|
|
258
|
-
const PeerID& peer_id,
|
|
259
|
-
uint32_t num_pieces);
|
|
260
|
-
|
|
261
|
-
/**
|
|
262
|
-
* @brief Unregister a torrent
|
|
263
|
-
*
|
|
264
|
-
* Closes all connections for this torrent.
|
|
265
|
-
*/
|
|
266
|
-
void unregister_torrent(const BtInfoHash& info_hash);
|
|
267
|
-
|
|
268
|
-
//=========================================================================
|
|
269
|
-
// Connection Management
|
|
270
|
-
//=========================================================================
|
|
271
|
-
|
|
272
|
-
/**
|
|
273
|
-
* @brief Initiate connection to a peer
|
|
274
|
-
*
|
|
275
|
-
* @param ip Peer IP address
|
|
276
|
-
* @param port Peer port
|
|
277
|
-
* @param info_hash Torrent info hash
|
|
278
|
-
* @param peer_id Our peer ID
|
|
279
|
-
* @param num_pieces Number of pieces (0 for magnet links)
|
|
280
|
-
* @return true if connection was queued
|
|
281
|
-
*/
|
|
282
|
-
bool connect_peer(const std::string& ip, uint16_t port,
|
|
283
|
-
const BtInfoHash& info_hash,
|
|
284
|
-
const PeerID& peer_id,
|
|
285
|
-
uint32_t num_pieces);
|
|
286
|
-
|
|
287
|
-
/**
|
|
288
|
-
* @brief Close a connection
|
|
289
|
-
*
|
|
290
|
-
* @param socket Socket to close
|
|
291
|
-
*/
|
|
292
|
-
void close_connection(socket_t socket);
|
|
293
|
-
|
|
294
|
-
/**
|
|
295
|
-
* @brief Send data to a peer
|
|
296
|
-
*
|
|
297
|
-
* Queues data in the send buffer; actual send is async.
|
|
298
|
-
*
|
|
299
|
-
* @param socket Target socket
|
|
300
|
-
* @param data Data to send
|
|
301
|
-
* @return true if queued successfully
|
|
302
|
-
*/
|
|
303
|
-
bool send_to_peer(socket_t socket, const std::vector<uint8_t>& data);
|
|
304
|
-
|
|
305
|
-
/**
|
|
306
|
-
* @brief Get number of active connections
|
|
307
|
-
*/
|
|
308
|
-
size_t connection_count() const;
|
|
309
|
-
|
|
310
|
-
/**
|
|
311
|
-
* @brief Get number of pending outgoing connections
|
|
312
|
-
*/
|
|
313
|
-
size_t pending_connect_count() const;
|
|
314
|
-
|
|
315
|
-
//=========================================================================
|
|
316
|
-
// Callbacks
|
|
317
|
-
//=========================================================================
|
|
318
|
-
|
|
319
|
-
void set_connected_callback(ConnectedCallback cb) {
|
|
320
|
-
on_connected_ = std::move(cb);
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
void set_disconnected_callback(DisconnectedCallback cb) {
|
|
324
|
-
on_disconnected_ = std::move(cb);
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
void set_data_callback(DataCallback cb) {
|
|
328
|
-
on_data_ = std::move(cb);
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
private:
|
|
332
|
-
//=========================================================================
|
|
333
|
-
// Internal Methods
|
|
334
|
-
//=========================================================================
|
|
335
|
-
|
|
336
|
-
/// Main I/O loop (runs in separate thread)
|
|
337
|
-
void io_loop();
|
|
338
|
-
|
|
339
|
-
/// Synchronize poller state with current connections (under mutex)
|
|
340
|
-
void sync_poller();
|
|
341
|
-
|
|
342
|
-
/// Process the queue of pending connections
|
|
343
|
-
void process_pending_connects();
|
|
344
|
-
|
|
345
|
-
/// Accept incoming connections
|
|
346
|
-
void accept_incoming();
|
|
347
|
-
|
|
348
|
-
/// Handle readable socket (returns true if connection should be closed)
|
|
349
|
-
bool handle_readable(socket_t socket,
|
|
350
|
-
std::vector<ConnectedEvent>& connected_events,
|
|
351
|
-
std::vector<DataEvent>& data_events);
|
|
352
|
-
|
|
353
|
-
/// Handle writable socket (drain send buffer, returns true if connection should be closed)
|
|
354
|
-
bool handle_writable(socket_t socket);
|
|
355
|
-
|
|
356
|
-
/// Handle data received from a peer (returns true if connection should be closed)
|
|
357
|
-
bool handle_peer_data(SocketContext& ctx,
|
|
358
|
-
std::vector<ConnectedEvent>& connected_events,
|
|
359
|
-
std::vector<DataEvent>& data_events);
|
|
360
|
-
|
|
361
|
-
/// Close connection with cleanup (collects disconnected events)
|
|
362
|
-
void close_connection_internal(socket_t socket,
|
|
363
|
-
std::vector<DisconnectedEvent>& disconnected_events);
|
|
364
|
-
|
|
365
|
-
/// Flush send buffers for a socket (returns true if connection should be closed)
|
|
366
|
-
bool flush_send_buffer(SocketContext& ctx);
|
|
367
|
-
|
|
368
|
-
/// Create socket for outgoing connection
|
|
369
|
-
socket_t create_connect_socket(const std::string& ip, uint16_t port);
|
|
370
|
-
|
|
371
|
-
/// Handle info_hash discovered from incoming connection handshake
|
|
372
|
-
void on_incoming_info_hash(BtPeerConnection* conn, const BtInfoHash& info_hash);
|
|
373
|
-
|
|
374
|
-
/// Set TCP_NODELAY on a socket (disable Nagle's algorithm)
|
|
375
|
-
static bool set_tcp_nodelay(socket_t sock);
|
|
376
|
-
|
|
377
|
-
//=========================================================================
|
|
378
|
-
// Data Members
|
|
379
|
-
//=========================================================================
|
|
380
|
-
|
|
381
|
-
BtNetworkConfig config_;
|
|
382
|
-
|
|
383
|
-
std::atomic<bool> running_;
|
|
384
|
-
std::atomic<uint16_t> actual_listen_port_;
|
|
385
|
-
|
|
386
|
-
socket_t listen_socket_;
|
|
387
|
-
|
|
388
|
-
mutable std::mutex mutex_;
|
|
389
|
-
|
|
390
|
-
/// Platform-optimal I/O poller (epoll/kqueue/WSAPoll)
|
|
391
|
-
std::unique_ptr<IOPoller> poller_;
|
|
392
|
-
|
|
393
|
-
/// Tracks current poller event mask per socket (to avoid redundant modify calls)
|
|
394
|
-
std::unordered_map<socket_t, uint32_t> poller_state_;
|
|
395
|
-
|
|
396
|
-
/// Active connections by socket
|
|
397
|
-
std::unordered_map<socket_t, SocketContext> connections_;
|
|
398
|
-
|
|
399
|
-
/// Registered torrents by info hash
|
|
400
|
-
std::unordered_map<BtInfoHash, TorrentRegistration, InfoHashHash> torrents_;
|
|
401
|
-
|
|
402
|
-
/// Queue of pending outgoing connections
|
|
403
|
-
std::queue<PendingConnect> pending_connects_;
|
|
404
|
-
|
|
405
|
-
/// Pending connects that are in progress (by socket)
|
|
406
|
-
std::unordered_map<socket_t, PendingConnect> connecting_;
|
|
407
|
-
|
|
408
|
-
/// I/O thread
|
|
409
|
-
std::thread io_thread_;
|
|
410
|
-
|
|
411
|
-
/// Callbacks
|
|
412
|
-
ConnectedCallback on_connected_;
|
|
413
|
-
DisconnectedCallback on_disconnected_;
|
|
414
|
-
DataCallback on_data_;
|
|
415
|
-
};
|
|
416
|
-
|
|
417
|
-
} // namespace librats
|