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,418 +0,0 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @file bt_torrent_info.h
|
|
5
|
-
* @brief Torrent metadata parsing and management
|
|
6
|
-
*
|
|
7
|
-
* Handles parsing of .torrent files and magnet URIs,
|
|
8
|
-
* computing info hashes, and managing torrent metadata.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
#include "bt_types.h"
|
|
12
|
-
#include "bt_file_storage.h"
|
|
13
|
-
#include "bencode.h"
|
|
14
|
-
|
|
15
|
-
#include <string>
|
|
16
|
-
#include <vector>
|
|
17
|
-
#include <optional>
|
|
18
|
-
#include <memory>
|
|
19
|
-
|
|
20
|
-
namespace librats {
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* @brief Tracker tier (for multi-tracker torrents)
|
|
24
|
-
*/
|
|
25
|
-
using TrackerTier = std::vector<std::string>;
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* @brief Error information for parsing failures
|
|
29
|
-
*/
|
|
30
|
-
struct TorrentParseError {
|
|
31
|
-
std::string message;
|
|
32
|
-
|
|
33
|
-
TorrentParseError() = default;
|
|
34
|
-
explicit TorrentParseError(const std::string& msg) : message(msg) {}
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* @brief Complete torrent metadata
|
|
39
|
-
*
|
|
40
|
-
* This class holds all metadata about a torrent, parsed from a .torrent file
|
|
41
|
-
* or received via the ut_metadata extension (BEP 9).
|
|
42
|
-
*
|
|
43
|
-
* Key data includes:
|
|
44
|
-
* - Info hash (SHA-1 of the bencoded info dictionary)
|
|
45
|
-
* - File structure (single file or directory with multiple files)
|
|
46
|
-
* - Piece hashes (SHA-1 hashes for each piece)
|
|
47
|
-
* - Tracker URLs
|
|
48
|
-
* - Optional metadata (comment, creation date, created by, etc.)
|
|
49
|
-
*
|
|
50
|
-
* Thread-safe for read operations after construction.
|
|
51
|
-
*/
|
|
52
|
-
class TorrentInfo {
|
|
53
|
-
public:
|
|
54
|
-
/**
|
|
55
|
-
* @brief Default constructor - creates empty/invalid torrent info
|
|
56
|
-
*/
|
|
57
|
-
TorrentInfo();
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* @brief Copy constructor
|
|
61
|
-
*/
|
|
62
|
-
TorrentInfo(const TorrentInfo& other);
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* @brief Move constructor
|
|
66
|
-
*/
|
|
67
|
-
TorrentInfo(TorrentInfo&& other) noexcept;
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* @brief Copy assignment
|
|
71
|
-
*/
|
|
72
|
-
TorrentInfo& operator=(const TorrentInfo& other);
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* @brief Move assignment
|
|
76
|
-
*/
|
|
77
|
-
TorrentInfo& operator=(TorrentInfo&& other) noexcept;
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* @brief Destructor
|
|
81
|
-
*/
|
|
82
|
-
~TorrentInfo();
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* @brief Load torrent metadata from raw bytes (rats-search compatibility)
|
|
86
|
-
*
|
|
87
|
-
* @param data Bencoded .torrent file data
|
|
88
|
-
* @return true if parsed successfully
|
|
89
|
-
*/
|
|
90
|
-
bool load_from_data(const std::vector<uint8_t>& data);
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* @brief Load torrent metadata from raw bytes (Qt/C style)
|
|
94
|
-
*
|
|
95
|
-
* @param data Pointer to data
|
|
96
|
-
* @param size Size of data
|
|
97
|
-
* @return true if parsed successfully
|
|
98
|
-
*/
|
|
99
|
-
bool load_from_data(const uint8_t* data, size_t size);
|
|
100
|
-
|
|
101
|
-
//=========================================================================
|
|
102
|
-
// Static Factory Methods
|
|
103
|
-
//=========================================================================
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* @brief Parse a .torrent file from bytes
|
|
107
|
-
*
|
|
108
|
-
* @param data Bencoded .torrent file data
|
|
109
|
-
* @param error Optional output for error information
|
|
110
|
-
* @return Parsed TorrentInfo, or empty if parsing failed
|
|
111
|
-
*/
|
|
112
|
-
static std::optional<TorrentInfo> from_bytes(
|
|
113
|
-
const std::vector<uint8_t>& data,
|
|
114
|
-
TorrentParseError* error = nullptr);
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* @brief Parse a .torrent file from a file path
|
|
118
|
-
*
|
|
119
|
-
* @param path Path to the .torrent file
|
|
120
|
-
* @param error Optional output for error information
|
|
121
|
-
* @return Parsed TorrentInfo, or empty if parsing failed
|
|
122
|
-
*/
|
|
123
|
-
static std::optional<TorrentInfo> from_file(
|
|
124
|
-
const std::string& path,
|
|
125
|
-
TorrentParseError* error = nullptr);
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* @brief Create TorrentInfo from a magnet URI
|
|
129
|
-
*
|
|
130
|
-
* Note: This creates a partial TorrentInfo with only the info hash.
|
|
131
|
-
* Full metadata must be obtained via DHT or ut_metadata extension.
|
|
132
|
-
*
|
|
133
|
-
* @param magnet_uri Magnet URI string
|
|
134
|
-
* @param error Optional output for error information
|
|
135
|
-
* @return Parsed TorrentInfo, or empty if parsing failed
|
|
136
|
-
*/
|
|
137
|
-
static std::optional<TorrentInfo> from_magnet(
|
|
138
|
-
const std::string& magnet_uri,
|
|
139
|
-
TorrentParseError* error = nullptr);
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* @brief Create TorrentInfo from raw info dictionary bytes
|
|
143
|
-
*
|
|
144
|
-
* Used when receiving metadata via ut_metadata extension.
|
|
145
|
-
*
|
|
146
|
-
* @param info_dict_bytes Raw bencoded info dictionary
|
|
147
|
-
* @param expected_hash Expected info hash (for verification)
|
|
148
|
-
* @param error Optional output for error information
|
|
149
|
-
* @return Parsed TorrentInfo, or empty if parsing failed
|
|
150
|
-
*/
|
|
151
|
-
static std::optional<TorrentInfo> from_info_dict(
|
|
152
|
-
const std::vector<uint8_t>& info_dict_bytes,
|
|
153
|
-
const BtInfoHash& expected_hash,
|
|
154
|
-
TorrentParseError* error = nullptr);
|
|
155
|
-
|
|
156
|
-
//=========================================================================
|
|
157
|
-
// Core Properties
|
|
158
|
-
//=========================================================================
|
|
159
|
-
|
|
160
|
-
/**
|
|
161
|
-
* @brief Check if this torrent info is valid
|
|
162
|
-
*
|
|
163
|
-
* A TorrentInfo is valid if it has at least an info hash.
|
|
164
|
-
* It may not have full metadata (e.g., from magnet link).
|
|
165
|
-
*/
|
|
166
|
-
bool is_valid() const { return !is_zero_hash(info_hash_); }
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* @brief Check if full metadata is available
|
|
170
|
-
*
|
|
171
|
-
* Returns false for magnet links until metadata is received.
|
|
172
|
-
*/
|
|
173
|
-
bool has_metadata() const { return has_metadata_; }
|
|
174
|
-
|
|
175
|
-
/**
|
|
176
|
-
* @brief Get the 20-byte info hash
|
|
177
|
-
*/
|
|
178
|
-
const BtInfoHash& info_hash() const { return info_hash_; }
|
|
179
|
-
|
|
180
|
-
/**
|
|
181
|
-
* @brief Get info hash as hex string
|
|
182
|
-
*/
|
|
183
|
-
std::string info_hash_hex() const { return info_hash_to_hex(info_hash_); }
|
|
184
|
-
|
|
185
|
-
/**
|
|
186
|
-
* @brief Get the torrent name
|
|
187
|
-
*/
|
|
188
|
-
const std::string& name() const { return name_; }
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
* @brief Get the comment (if present)
|
|
192
|
-
*/
|
|
193
|
-
const std::string& comment() const { return comment_; }
|
|
194
|
-
|
|
195
|
-
/**
|
|
196
|
-
* @brief Get the "created by" string (if present)
|
|
197
|
-
*/
|
|
198
|
-
const std::string& created_by() const { return created_by_; }
|
|
199
|
-
|
|
200
|
-
/**
|
|
201
|
-
* @brief Get creation date as Unix timestamp (0 if not present)
|
|
202
|
-
*/
|
|
203
|
-
int64_t creation_date() const { return creation_date_; }
|
|
204
|
-
|
|
205
|
-
/**
|
|
206
|
-
* @brief Check if this is a private torrent
|
|
207
|
-
*/
|
|
208
|
-
bool is_private() const { return is_private_; }
|
|
209
|
-
|
|
210
|
-
//=========================================================================
|
|
211
|
-
// File and Piece Information
|
|
212
|
-
//=========================================================================
|
|
213
|
-
|
|
214
|
-
/**
|
|
215
|
-
* @brief Get the file storage (file layout)
|
|
216
|
-
*/
|
|
217
|
-
const FileStorage& files() const { return files_; }
|
|
218
|
-
|
|
219
|
-
/**
|
|
220
|
-
* @brief Get total size of all files in bytes
|
|
221
|
-
*/
|
|
222
|
-
int64_t total_size() const { return files_.total_size(); }
|
|
223
|
-
|
|
224
|
-
/**
|
|
225
|
-
* @brief Get number of files
|
|
226
|
-
*/
|
|
227
|
-
size_t num_files() const { return files_.num_files(); }
|
|
228
|
-
|
|
229
|
-
/**
|
|
230
|
-
* @brief Get piece length
|
|
231
|
-
*/
|
|
232
|
-
uint32_t piece_length() const { return files_.piece_length(); }
|
|
233
|
-
|
|
234
|
-
/**
|
|
235
|
-
* @brief Get number of pieces
|
|
236
|
-
*/
|
|
237
|
-
uint32_t num_pieces() const { return files_.num_pieces(); }
|
|
238
|
-
|
|
239
|
-
/**
|
|
240
|
-
* @brief Get size of a specific piece
|
|
241
|
-
*/
|
|
242
|
-
uint32_t piece_size(uint32_t index) const { return files_.piece_size(index); }
|
|
243
|
-
|
|
244
|
-
/**
|
|
245
|
-
* @brief Get the SHA-1 hash for a piece
|
|
246
|
-
* @param index Piece index
|
|
247
|
-
* @return 20-byte hash, or empty array if index invalid
|
|
248
|
-
*/
|
|
249
|
-
std::array<uint8_t, 20> piece_hash(uint32_t index) const;
|
|
250
|
-
|
|
251
|
-
/**
|
|
252
|
-
* @brief Get all piece hashes (concatenated 20-byte hashes)
|
|
253
|
-
*/
|
|
254
|
-
const std::vector<uint8_t>& piece_hashes() const { return piece_hashes_; }
|
|
255
|
-
|
|
256
|
-
//=========================================================================
|
|
257
|
-
// Trackers
|
|
258
|
-
//=========================================================================
|
|
259
|
-
|
|
260
|
-
/**
|
|
261
|
-
* @brief Get the primary tracker URL (announce)
|
|
262
|
-
*/
|
|
263
|
-
const std::string& announce() const { return announce_; }
|
|
264
|
-
|
|
265
|
-
/**
|
|
266
|
-
* @brief Get all tracker tiers (announce-list)
|
|
267
|
-
*/
|
|
268
|
-
const std::vector<TrackerTier>& announce_list() const { return announce_list_; }
|
|
269
|
-
|
|
270
|
-
/**
|
|
271
|
-
* @brief Get a flat list of all tracker URLs
|
|
272
|
-
*/
|
|
273
|
-
std::vector<std::string> all_trackers() const;
|
|
274
|
-
|
|
275
|
-
//=========================================================================
|
|
276
|
-
// Web Seeds
|
|
277
|
-
//=========================================================================
|
|
278
|
-
|
|
279
|
-
/**
|
|
280
|
-
* @brief Get web seed URLs (url-list)
|
|
281
|
-
*/
|
|
282
|
-
const std::vector<std::string>& web_seeds() const { return web_seeds_; }
|
|
283
|
-
|
|
284
|
-
//=========================================================================
|
|
285
|
-
// DHT Nodes
|
|
286
|
-
//=========================================================================
|
|
287
|
-
|
|
288
|
-
/**
|
|
289
|
-
* @brief DHT node entry (host, port)
|
|
290
|
-
*/
|
|
291
|
-
struct DhtNode {
|
|
292
|
-
std::string host;
|
|
293
|
-
uint16_t port;
|
|
294
|
-
};
|
|
295
|
-
|
|
296
|
-
/**
|
|
297
|
-
* @brief Get DHT nodes embedded in torrent
|
|
298
|
-
*/
|
|
299
|
-
const std::vector<DhtNode>& dht_nodes() const { return dht_nodes_; }
|
|
300
|
-
|
|
301
|
-
//=========================================================================
|
|
302
|
-
// Raw Data Access
|
|
303
|
-
//=========================================================================
|
|
304
|
-
|
|
305
|
-
/**
|
|
306
|
-
* @brief Get the raw info dictionary bytes
|
|
307
|
-
*
|
|
308
|
-
* This is the exact bytes that hash to the info_hash.
|
|
309
|
-
* Used for ut_metadata exchange.
|
|
310
|
-
*/
|
|
311
|
-
const std::vector<uint8_t>& info_dict_bytes() const { return info_dict_bytes_; }
|
|
312
|
-
|
|
313
|
-
/**
|
|
314
|
-
* @brief Get size of info dictionary in bytes
|
|
315
|
-
*/
|
|
316
|
-
size_t metadata_size() const { return info_dict_bytes_.size(); }
|
|
317
|
-
|
|
318
|
-
//=========================================================================
|
|
319
|
-
// Magnet URI
|
|
320
|
-
//=========================================================================
|
|
321
|
-
|
|
322
|
-
/**
|
|
323
|
-
* @brief Generate a magnet URI for this torrent
|
|
324
|
-
* @param include_trackers Include tracker URLs in magnet
|
|
325
|
-
* @return Magnet URI string
|
|
326
|
-
*/
|
|
327
|
-
std::string to_magnet_uri(bool include_trackers = true) const;
|
|
328
|
-
|
|
329
|
-
//=========================================================================
|
|
330
|
-
// Metadata Update (for magnet links)
|
|
331
|
-
//=========================================================================
|
|
332
|
-
|
|
333
|
-
/**
|
|
334
|
-
* @brief Set metadata received from ut_metadata
|
|
335
|
-
*
|
|
336
|
-
* Used to complete a TorrentInfo that was created from a magnet link.
|
|
337
|
-
*
|
|
338
|
-
* @param info_dict_bytes Raw info dictionary
|
|
339
|
-
* @return true if metadata is valid and matches info hash
|
|
340
|
-
*/
|
|
341
|
-
bool set_metadata(const std::vector<uint8_t>& info_dict_bytes);
|
|
342
|
-
|
|
343
|
-
private:
|
|
344
|
-
// Core data
|
|
345
|
-
BtInfoHash info_hash_;
|
|
346
|
-
std::string name_;
|
|
347
|
-
std::string comment_;
|
|
348
|
-
std::string created_by_;
|
|
349
|
-
int64_t creation_date_;
|
|
350
|
-
bool is_private_;
|
|
351
|
-
bool has_metadata_;
|
|
352
|
-
|
|
353
|
-
// File layout
|
|
354
|
-
FileStorage files_;
|
|
355
|
-
|
|
356
|
-
// Piece hashes (concatenated 20-byte SHA-1 hashes)
|
|
357
|
-
std::vector<uint8_t> piece_hashes_;
|
|
358
|
-
|
|
359
|
-
// Trackers
|
|
360
|
-
std::string announce_;
|
|
361
|
-
std::vector<TrackerTier> announce_list_;
|
|
362
|
-
|
|
363
|
-
// Web seeds
|
|
364
|
-
std::vector<std::string> web_seeds_;
|
|
365
|
-
|
|
366
|
-
// DHT nodes
|
|
367
|
-
std::vector<DhtNode> dht_nodes_;
|
|
368
|
-
|
|
369
|
-
// Raw info dict for ut_metadata
|
|
370
|
-
std::vector<uint8_t> info_dict_bytes_;
|
|
371
|
-
|
|
372
|
-
//=========================================================================
|
|
373
|
-
// Private Helpers
|
|
374
|
-
//=========================================================================
|
|
375
|
-
|
|
376
|
-
/**
|
|
377
|
-
* @brief Parse the info dictionary
|
|
378
|
-
*/
|
|
379
|
-
bool parse_info_dict(const BencodeValue& info_dict, TorrentParseError* error);
|
|
380
|
-
|
|
381
|
-
/**
|
|
382
|
-
* @brief Calculate info hash from raw bytes
|
|
383
|
-
*/
|
|
384
|
-
static BtInfoHash calculate_info_hash(const std::vector<uint8_t>& info_bytes);
|
|
385
|
-
|
|
386
|
-
/**
|
|
387
|
-
* @brief URL encode a string for magnet URI
|
|
388
|
-
*/
|
|
389
|
-
static std::string url_encode(const std::string& str);
|
|
390
|
-
};
|
|
391
|
-
|
|
392
|
-
//=============================================================================
|
|
393
|
-
// Magnet URI Parsing Helpers
|
|
394
|
-
//=============================================================================
|
|
395
|
-
|
|
396
|
-
/**
|
|
397
|
-
* @brief Parse a magnet URI and extract components
|
|
398
|
-
*/
|
|
399
|
-
struct MagnetUri {
|
|
400
|
-
BtInfoHash info_hash;
|
|
401
|
-
std::string display_name;
|
|
402
|
-
std::vector<std::string> trackers;
|
|
403
|
-
std::vector<std::string> web_seeds;
|
|
404
|
-
|
|
405
|
-
/**
|
|
406
|
-
* @brief Parse a magnet URI string
|
|
407
|
-
* @param uri The magnet URI
|
|
408
|
-
* @return Parsed components, or nullopt on failure
|
|
409
|
-
*/
|
|
410
|
-
static std::optional<MagnetUri> parse(const std::string& uri);
|
|
411
|
-
|
|
412
|
-
/**
|
|
413
|
-
* @brief Check if info hash is valid
|
|
414
|
-
*/
|
|
415
|
-
bool is_valid() const { return !is_zero_hash(info_hash); }
|
|
416
|
-
};
|
|
417
|
-
|
|
418
|
-
} // namespace librats
|