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,473 +0,0 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @file bt_create_torrent.h
|
|
5
|
-
* @brief Torrent file creation and generation
|
|
6
|
-
*
|
|
7
|
-
* Provides functionality to create .torrent files from files or directories.
|
|
8
|
-
* Supports both single-file and multi-file torrents.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
#include "bt_types.h"
|
|
12
|
-
#include "bt_file_storage.h"
|
|
13
|
-
#include "bt_torrent_info.h"
|
|
14
|
-
#include "bencode.h"
|
|
15
|
-
|
|
16
|
-
#include <string>
|
|
17
|
-
#include <vector>
|
|
18
|
-
#include <optional>
|
|
19
|
-
#include <functional>
|
|
20
|
-
#include <ctime>
|
|
21
|
-
|
|
22
|
-
namespace librats {
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* @brief Error information for torrent creation failures
|
|
26
|
-
*/
|
|
27
|
-
struct TorrentCreateError {
|
|
28
|
-
std::string message;
|
|
29
|
-
|
|
30
|
-
TorrentCreateError() = default;
|
|
31
|
-
explicit TorrentCreateError(const std::string& msg) : message(msg) {}
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* @brief Configuration for torrent creation
|
|
36
|
-
*/
|
|
37
|
-
struct TorrentCreatorConfig {
|
|
38
|
-
uint32_t piece_size = 0; ///< Piece size in bytes (0 = auto-detect)
|
|
39
|
-
bool is_private = false; ///< Private torrent flag
|
|
40
|
-
std::string comment; ///< Optional comment
|
|
41
|
-
std::string created_by; ///< Optional creator string
|
|
42
|
-
std::time_t creation_date = 0; ///< Creation timestamp (0 = current time)
|
|
43
|
-
bool include_hidden_files = false; ///< Include hidden files when adding directories
|
|
44
|
-
|
|
45
|
-
TorrentCreatorConfig() : creation_date(std::time(nullptr)) {}
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* @brief Progress callback for piece hashing
|
|
50
|
-
*
|
|
51
|
-
* @param current_piece Current piece being hashed (0-indexed)
|
|
52
|
-
* @param total_pieces Total number of pieces
|
|
53
|
-
*/
|
|
54
|
-
using PieceHashProgressCallback = std::function<void(uint32_t current_piece, uint32_t total_pieces)>;
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* @brief File filter callback for directory traversal
|
|
58
|
-
*
|
|
59
|
-
* @param path Full path to the file or directory
|
|
60
|
-
* @return true to include the file/traverse the directory, false to skip
|
|
61
|
-
*/
|
|
62
|
-
using FileFilterCallback = std::function<bool(const std::string& path)>;
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* @brief Creates torrent files from files or directories
|
|
66
|
-
*
|
|
67
|
-
* This class provides a simple API to create .torrent files:
|
|
68
|
-
*
|
|
69
|
-
* 1. Create TorrentCreator with base path
|
|
70
|
-
* 2. Add files or let it scan directories
|
|
71
|
-
* 3. Set properties (trackers, comment, etc.)
|
|
72
|
-
* 4. Call set_piece_hashes() to compute hashes
|
|
73
|
-
* 5. Call generate() to get the bencoded torrent data
|
|
74
|
-
*
|
|
75
|
-
* Example usage:
|
|
76
|
-
* @code
|
|
77
|
-
* TorrentCreator creator("./my_folder");
|
|
78
|
-
* creator.add_tracker("http://tracker.example.com/announce");
|
|
79
|
-
* creator.set_comment("My torrent");
|
|
80
|
-
*
|
|
81
|
-
* // Hash pieces (this reads all file content)
|
|
82
|
-
* creator.set_piece_hashes([](uint32_t current, uint32_t total) {
|
|
83
|
-
* std::cout << "Hashing piece " << current << "/" << total << std::endl;
|
|
84
|
-
* });
|
|
85
|
-
*
|
|
86
|
-
* // Generate torrent data
|
|
87
|
-
* auto torrent_data = creator.generate();
|
|
88
|
-
* @endcode
|
|
89
|
-
*
|
|
90
|
-
* Thread-safety: Not thread-safe during construction/modification.
|
|
91
|
-
* After generate() is called, the resulting data can be used from any thread.
|
|
92
|
-
*/
|
|
93
|
-
class TorrentCreator {
|
|
94
|
-
public:
|
|
95
|
-
/**
|
|
96
|
-
* @brief Create a torrent creator for a file or directory
|
|
97
|
-
*
|
|
98
|
-
* If path points to a directory, all files in it will be included.
|
|
99
|
-
* If path points to a file, a single-file torrent will be created.
|
|
100
|
-
*
|
|
101
|
-
* @param path Path to file or directory
|
|
102
|
-
* @param config Optional configuration
|
|
103
|
-
*/
|
|
104
|
-
explicit TorrentCreator(const std::string& path,
|
|
105
|
-
const TorrentCreatorConfig& config = TorrentCreatorConfig());
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* @brief Create a torrent creator with custom file storage
|
|
109
|
-
*
|
|
110
|
-
* Use this when you want manual control over which files are included.
|
|
111
|
-
*
|
|
112
|
-
* @param storage Pre-configured file storage
|
|
113
|
-
* @param base_path Base path where files are located
|
|
114
|
-
* @param config Optional configuration
|
|
115
|
-
*/
|
|
116
|
-
TorrentCreator(FileStorage&& storage,
|
|
117
|
-
const std::string& base_path,
|
|
118
|
-
const TorrentCreatorConfig& config = TorrentCreatorConfig());
|
|
119
|
-
|
|
120
|
-
~TorrentCreator() = default;
|
|
121
|
-
|
|
122
|
-
// Non-copyable, moveable
|
|
123
|
-
TorrentCreator(const TorrentCreator&) = delete;
|
|
124
|
-
TorrentCreator& operator=(const TorrentCreator&) = delete;
|
|
125
|
-
TorrentCreator(TorrentCreator&&) noexcept = default;
|
|
126
|
-
TorrentCreator& operator=(TorrentCreator&&) noexcept = default;
|
|
127
|
-
|
|
128
|
-
//=========================================================================
|
|
129
|
-
// File Management
|
|
130
|
-
//=========================================================================
|
|
131
|
-
|
|
132
|
-
/**
|
|
133
|
-
* @brief Scan path and add all files
|
|
134
|
-
*
|
|
135
|
-
* If the creator was constructed with a directory path, this is called
|
|
136
|
-
* automatically. Call this to re-scan or to scan with a custom filter.
|
|
137
|
-
*
|
|
138
|
-
* @param filter Optional filter callback
|
|
139
|
-
* @return Number of files added
|
|
140
|
-
*/
|
|
141
|
-
size_t scan_files(FileFilterCallback filter = nullptr);
|
|
142
|
-
|
|
143
|
-
/**
|
|
144
|
-
* @brief Add a single file manually
|
|
145
|
-
*
|
|
146
|
-
* @param relative_path Path relative to the base path
|
|
147
|
-
* @param size File size in bytes
|
|
148
|
-
* @return true if added successfully
|
|
149
|
-
*/
|
|
150
|
-
bool add_file(const std::string& relative_path, int64_t size);
|
|
151
|
-
|
|
152
|
-
/**
|
|
153
|
-
* @brief Get the file storage
|
|
154
|
-
*/
|
|
155
|
-
const FileStorage& files() const { return files_; }
|
|
156
|
-
|
|
157
|
-
/**
|
|
158
|
-
* @brief Get number of files
|
|
159
|
-
*/
|
|
160
|
-
size_t num_files() const { return files_.num_files(); }
|
|
161
|
-
|
|
162
|
-
/**
|
|
163
|
-
* @brief Get total size of all files
|
|
164
|
-
*/
|
|
165
|
-
int64_t total_size() const { return files_.total_size(); }
|
|
166
|
-
|
|
167
|
-
//=========================================================================
|
|
168
|
-
// Torrent Properties
|
|
169
|
-
//=========================================================================
|
|
170
|
-
|
|
171
|
-
/**
|
|
172
|
-
* @brief Set the torrent name
|
|
173
|
-
*
|
|
174
|
-
* By default, the name is derived from the path.
|
|
175
|
-
*
|
|
176
|
-
* @param name Torrent name
|
|
177
|
-
*/
|
|
178
|
-
void set_name(const std::string& name);
|
|
179
|
-
|
|
180
|
-
/**
|
|
181
|
-
* @brief Get the torrent name
|
|
182
|
-
*/
|
|
183
|
-
const std::string& name() const { return files_.name(); }
|
|
184
|
-
|
|
185
|
-
/**
|
|
186
|
-
* @brief Set the comment
|
|
187
|
-
*/
|
|
188
|
-
void set_comment(const std::string& comment) { comment_ = comment; }
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
* @brief Get the comment
|
|
192
|
-
*/
|
|
193
|
-
const std::string& comment() const { return comment_; }
|
|
194
|
-
|
|
195
|
-
/**
|
|
196
|
-
* @brief Set the creator string
|
|
197
|
-
*/
|
|
198
|
-
void set_creator(const std::string& creator) { created_by_ = creator; }
|
|
199
|
-
|
|
200
|
-
/**
|
|
201
|
-
* @brief Get the creator string
|
|
202
|
-
*/
|
|
203
|
-
const std::string& creator() const { return created_by_; }
|
|
204
|
-
|
|
205
|
-
/**
|
|
206
|
-
* @brief Set the creation date
|
|
207
|
-
* @param timestamp Unix timestamp (0 to omit from torrent)
|
|
208
|
-
*/
|
|
209
|
-
void set_creation_date(std::time_t timestamp) { creation_date_ = timestamp; }
|
|
210
|
-
|
|
211
|
-
/**
|
|
212
|
-
* @brief Get the creation date
|
|
213
|
-
*/
|
|
214
|
-
std::time_t creation_date() const { return creation_date_; }
|
|
215
|
-
|
|
216
|
-
/**
|
|
217
|
-
* @brief Set private flag
|
|
218
|
-
*/
|
|
219
|
-
void set_private(bool is_private) { is_private_ = is_private; }
|
|
220
|
-
|
|
221
|
-
/**
|
|
222
|
-
* @brief Check if private flag is set
|
|
223
|
-
*/
|
|
224
|
-
bool is_private() const { return is_private_; }
|
|
225
|
-
|
|
226
|
-
/**
|
|
227
|
-
* @brief Set piece size manually
|
|
228
|
-
*
|
|
229
|
-
* If not set (or 0), an appropriate piece size will be chosen automatically
|
|
230
|
-
* based on the total file size.
|
|
231
|
-
*
|
|
232
|
-
* @param size Piece size in bytes (must be power of 2, >= 16 KiB)
|
|
233
|
-
*/
|
|
234
|
-
void set_piece_size(uint32_t size);
|
|
235
|
-
|
|
236
|
-
/**
|
|
237
|
-
* @brief Get piece size
|
|
238
|
-
*/
|
|
239
|
-
uint32_t piece_size() const { return piece_size_; }
|
|
240
|
-
|
|
241
|
-
/**
|
|
242
|
-
* @brief Get number of pieces
|
|
243
|
-
*/
|
|
244
|
-
uint32_t num_pieces() const { return files_.num_pieces(); }
|
|
245
|
-
|
|
246
|
-
//=========================================================================
|
|
247
|
-
// Trackers
|
|
248
|
-
//=========================================================================
|
|
249
|
-
|
|
250
|
-
/**
|
|
251
|
-
* @brief Add a tracker URL
|
|
252
|
-
*
|
|
253
|
-
* @param url Tracker URL (http:// or udp://)
|
|
254
|
-
* @param tier Tracker tier (0 = primary, higher = fallback)
|
|
255
|
-
*/
|
|
256
|
-
void add_tracker(const std::string& url, int tier = 0);
|
|
257
|
-
|
|
258
|
-
/**
|
|
259
|
-
* @brief Get all tracker URLs
|
|
260
|
-
*/
|
|
261
|
-
std::vector<std::string> trackers() const;
|
|
262
|
-
|
|
263
|
-
/**
|
|
264
|
-
* @brief Clear all trackers
|
|
265
|
-
*/
|
|
266
|
-
void clear_trackers() { trackers_.clear(); }
|
|
267
|
-
|
|
268
|
-
//=========================================================================
|
|
269
|
-
// Web Seeds
|
|
270
|
-
//=========================================================================
|
|
271
|
-
|
|
272
|
-
/**
|
|
273
|
-
* @brief Add a web seed URL
|
|
274
|
-
*/
|
|
275
|
-
void add_url_seed(const std::string& url);
|
|
276
|
-
|
|
277
|
-
/**
|
|
278
|
-
* @brief Add an HTTP seed URL
|
|
279
|
-
*/
|
|
280
|
-
void add_http_seed(const std::string& url);
|
|
281
|
-
|
|
282
|
-
/**
|
|
283
|
-
* @brief Get URL seeds
|
|
284
|
-
*/
|
|
285
|
-
const std::vector<std::string>& url_seeds() const { return url_seeds_; }
|
|
286
|
-
|
|
287
|
-
/**
|
|
288
|
-
* @brief Get HTTP seeds
|
|
289
|
-
*/
|
|
290
|
-
const std::vector<std::string>& http_seeds() const { return http_seeds_; }
|
|
291
|
-
|
|
292
|
-
//=========================================================================
|
|
293
|
-
// DHT Nodes
|
|
294
|
-
//=========================================================================
|
|
295
|
-
|
|
296
|
-
/**
|
|
297
|
-
* @brief Add a DHT bootstrap node
|
|
298
|
-
*/
|
|
299
|
-
void add_dht_node(const std::string& host, uint16_t port);
|
|
300
|
-
|
|
301
|
-
//=========================================================================
|
|
302
|
-
// Piece Hashing
|
|
303
|
-
//=========================================================================
|
|
304
|
-
|
|
305
|
-
/**
|
|
306
|
-
* @brief Compute piece hashes by reading all files
|
|
307
|
-
*
|
|
308
|
-
* This is a potentially long operation as it reads all file content.
|
|
309
|
-
* Call this before generate().
|
|
310
|
-
*
|
|
311
|
-
* @param progress_callback Optional callback for progress updates
|
|
312
|
-
* @param error Optional output for error information
|
|
313
|
-
* @return true if all pieces were hashed successfully
|
|
314
|
-
*/
|
|
315
|
-
bool set_piece_hashes(PieceHashProgressCallback progress_callback = nullptr,
|
|
316
|
-
TorrentCreateError* error = nullptr);
|
|
317
|
-
|
|
318
|
-
/**
|
|
319
|
-
* @brief Check if piece hashes have been computed
|
|
320
|
-
*/
|
|
321
|
-
bool has_piece_hashes() const { return !piece_hashes_.empty(); }
|
|
322
|
-
|
|
323
|
-
//=========================================================================
|
|
324
|
-
// Generation
|
|
325
|
-
//=========================================================================
|
|
326
|
-
|
|
327
|
-
/**
|
|
328
|
-
* @brief Generate the bencoded torrent data
|
|
329
|
-
*
|
|
330
|
-
* Requires set_piece_hashes() to have been called first.
|
|
331
|
-
*
|
|
332
|
-
* @param error Optional output for error information
|
|
333
|
-
* @return Bencoded torrent data, or empty vector on failure
|
|
334
|
-
*/
|
|
335
|
-
std::vector<uint8_t> generate(TorrentCreateError* error = nullptr) const;
|
|
336
|
-
|
|
337
|
-
/**
|
|
338
|
-
* @brief Generate and save to a file
|
|
339
|
-
*
|
|
340
|
-
* @param output_path Path to save the .torrent file
|
|
341
|
-
* @param error Optional output for error information
|
|
342
|
-
* @return true if saved successfully
|
|
343
|
-
*/
|
|
344
|
-
bool save_to_file(const std::string& output_path,
|
|
345
|
-
TorrentCreateError* error = nullptr) const;
|
|
346
|
-
|
|
347
|
-
/**
|
|
348
|
-
* @brief Generate and return a TorrentInfo object
|
|
349
|
-
*
|
|
350
|
-
* @param error Optional output for error information
|
|
351
|
-
* @return TorrentInfo object, or empty if generation failed
|
|
352
|
-
*/
|
|
353
|
-
std::optional<TorrentInfo> generate_torrent_info(TorrentCreateError* error = nullptr) const;
|
|
354
|
-
|
|
355
|
-
/**
|
|
356
|
-
* @brief Get the info hash without generating full torrent
|
|
357
|
-
*
|
|
358
|
-
* Requires set_piece_hashes() to have been called.
|
|
359
|
-
*
|
|
360
|
-
* @return Info hash, or zero hash if not ready
|
|
361
|
-
*/
|
|
362
|
-
BtInfoHash info_hash() const;
|
|
363
|
-
|
|
364
|
-
/**
|
|
365
|
-
* @brief Get the info hash as hex string
|
|
366
|
-
*/
|
|
367
|
-
std::string info_hash_hex() const;
|
|
368
|
-
|
|
369
|
-
private:
|
|
370
|
-
std::string base_path_;
|
|
371
|
-
FileStorage files_;
|
|
372
|
-
|
|
373
|
-
// Torrent metadata
|
|
374
|
-
std::string comment_;
|
|
375
|
-
std::string created_by_;
|
|
376
|
-
std::time_t creation_date_;
|
|
377
|
-
bool is_private_;
|
|
378
|
-
uint32_t piece_size_;
|
|
379
|
-
|
|
380
|
-
// Trackers (url, tier)
|
|
381
|
-
std::vector<std::pair<std::string, int>> trackers_;
|
|
382
|
-
|
|
383
|
-
// Seeds
|
|
384
|
-
std::vector<std::string> url_seeds_;
|
|
385
|
-
std::vector<std::string> http_seeds_;
|
|
386
|
-
|
|
387
|
-
// DHT nodes (host, port)
|
|
388
|
-
std::vector<std::pair<std::string, uint16_t>> dht_nodes_;
|
|
389
|
-
|
|
390
|
-
// Piece hashes (concatenated 20-byte SHA-1 hashes)
|
|
391
|
-
std::vector<uint8_t> piece_hashes_;
|
|
392
|
-
|
|
393
|
-
// Cached info hash
|
|
394
|
-
mutable BtInfoHash cached_info_hash_;
|
|
395
|
-
mutable bool info_hash_valid_;
|
|
396
|
-
|
|
397
|
-
/**
|
|
398
|
-
* @brief Auto-detect optimal piece size
|
|
399
|
-
*/
|
|
400
|
-
uint32_t auto_detect_piece_size() const;
|
|
401
|
-
|
|
402
|
-
/**
|
|
403
|
-
* @brief Scan directory recursively
|
|
404
|
-
*/
|
|
405
|
-
void scan_directory(const std::string& dir_path,
|
|
406
|
-
const std::string& relative_prefix,
|
|
407
|
-
FileFilterCallback filter);
|
|
408
|
-
|
|
409
|
-
/**
|
|
410
|
-
* @brief Build the info dictionary
|
|
411
|
-
*/
|
|
412
|
-
BencodeValue build_info_dict() const;
|
|
413
|
-
|
|
414
|
-
/**
|
|
415
|
-
* @brief Build the complete torrent dictionary
|
|
416
|
-
*/
|
|
417
|
-
BencodeValue build_torrent_dict() const;
|
|
418
|
-
};
|
|
419
|
-
|
|
420
|
-
//=============================================================================
|
|
421
|
-
// Convenience Functions
|
|
422
|
-
//=============================================================================
|
|
423
|
-
|
|
424
|
-
/**
|
|
425
|
-
* @brief Add files from a path to FileStorage
|
|
426
|
-
*
|
|
427
|
-
* Recursively adds all files from a directory, or adds a single file.
|
|
428
|
-
*
|
|
429
|
-
* @param storage FileStorage to add files to
|
|
430
|
-
* @param path Path to file or directory
|
|
431
|
-
* @param filter Optional filter callback
|
|
432
|
-
* @return Number of files added
|
|
433
|
-
*/
|
|
434
|
-
size_t add_files(FileStorage& storage, const std::string& path,
|
|
435
|
-
FileFilterCallback filter = nullptr);
|
|
436
|
-
|
|
437
|
-
/**
|
|
438
|
-
* @brief Create a torrent from a file or directory
|
|
439
|
-
*
|
|
440
|
-
* Convenience function that creates a torrent in one call.
|
|
441
|
-
*
|
|
442
|
-
* @param path Path to file or directory
|
|
443
|
-
* @param output_path Path to save the .torrent file
|
|
444
|
-
* @param trackers Optional list of tracker URLs
|
|
445
|
-
* @param comment Optional comment
|
|
446
|
-
* @param progress_callback Optional progress callback
|
|
447
|
-
* @param error Optional output for error information
|
|
448
|
-
* @return true if torrent was created successfully
|
|
449
|
-
*/
|
|
450
|
-
bool create_torrent(const std::string& path,
|
|
451
|
-
const std::string& output_path,
|
|
452
|
-
const std::vector<std::string>& trackers = {},
|
|
453
|
-
const std::string& comment = "",
|
|
454
|
-
PieceHashProgressCallback progress_callback = nullptr,
|
|
455
|
-
TorrentCreateError* error = nullptr);
|
|
456
|
-
|
|
457
|
-
/**
|
|
458
|
-
* @brief Create a torrent and return the data
|
|
459
|
-
*
|
|
460
|
-
* @param path Path to file or directory
|
|
461
|
-
* @param trackers Optional list of tracker URLs
|
|
462
|
-
* @param comment Optional comment
|
|
463
|
-
* @param progress_callback Optional progress callback
|
|
464
|
-
* @param error Optional output for error information
|
|
465
|
-
* @return Bencoded torrent data, or empty vector on failure
|
|
466
|
-
*/
|
|
467
|
-
std::vector<uint8_t> create_torrent_data(const std::string& path,
|
|
468
|
-
const std::vector<std::string>& trackers = {},
|
|
469
|
-
const std::string& comment = "",
|
|
470
|
-
PieceHashProgressCallback progress_callback = nullptr,
|
|
471
|
-
TorrentCreateError* error = nullptr);
|
|
472
|
-
|
|
473
|
-
} // namespace librats
|