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,74 +0,0 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @file bittorrent.h
|
|
5
|
-
* @brief Main include file for BitTorrent functionality
|
|
6
|
-
*
|
|
7
|
-
* This header aggregates all BitTorrent-related headers for convenience.
|
|
8
|
-
* Include this single file to access the complete BitTorrent implementation.
|
|
9
|
-
*
|
|
10
|
-
* Components:
|
|
11
|
-
* - bt_types.h: Core types, constants, and utilities
|
|
12
|
-
* - bt_bitfield.h: Efficient bit array for piece tracking
|
|
13
|
-
* - bt_file_storage.h: File layout and piece-to-file mapping
|
|
14
|
-
* - bt_torrent_info.h: .torrent file parsing and magnet URIs
|
|
15
|
-
* - bt_piece_picker.h: Rarest-first piece selection
|
|
16
|
-
* - bt_messages.h: Protocol message encoding/decoding
|
|
17
|
-
* - bt_handshake.h: Handshake handling
|
|
18
|
-
* - bt_peer_connection.h: Peer connection management
|
|
19
|
-
* - bt_extension.h: Extension protocol (BEP 10, ut_metadata, ut_pex)
|
|
20
|
-
* - bt_choker.h: Choking algorithm
|
|
21
|
-
* - bt_torrent.h: Active torrent state machine
|
|
22
|
-
* - bt_client.h: High-level BitTorrent client
|
|
23
|
-
*
|
|
24
|
-
* Usage:
|
|
25
|
-
* @code
|
|
26
|
-
* #include "bittorrent.h"
|
|
27
|
-
*
|
|
28
|
-
* using namespace librats;
|
|
29
|
-
*
|
|
30
|
-
* // Create client
|
|
31
|
-
* BtClient client;
|
|
32
|
-
* client.start();
|
|
33
|
-
*
|
|
34
|
-
* // Add torrent from file
|
|
35
|
-
* auto torrent = client.add_torrent_file("example.torrent", "/downloads");
|
|
36
|
-
*
|
|
37
|
-
* // Or from magnet link
|
|
38
|
-
* auto torrent2 = client.add_magnet("magnet:?xt=urn:btih:...");
|
|
39
|
-
* @endcode
|
|
40
|
-
*/
|
|
41
|
-
|
|
42
|
-
#ifdef RATS_SEARCH_FEATURES
|
|
43
|
-
|
|
44
|
-
#include "bt_types.h"
|
|
45
|
-
#include "bt_bitfield.h"
|
|
46
|
-
#include "bt_file_storage.h"
|
|
47
|
-
#include "bt_torrent_info.h"
|
|
48
|
-
#include "bt_piece_picker.h"
|
|
49
|
-
#include "bt_messages.h"
|
|
50
|
-
#include "bt_handshake.h"
|
|
51
|
-
#include "bt_peer_connection.h"
|
|
52
|
-
#include "bt_extension.h"
|
|
53
|
-
#include "bt_choker.h"
|
|
54
|
-
#include "bt_torrent.h"
|
|
55
|
-
#include "bt_client.h"
|
|
56
|
-
|
|
57
|
-
namespace librats {
|
|
58
|
-
|
|
59
|
-
//=============================================================================
|
|
60
|
-
// Type aliases for compatibility with existing librats API
|
|
61
|
-
//=============================================================================
|
|
62
|
-
|
|
63
|
-
/// Alias for TorrentDownload (used by RatsClient API)
|
|
64
|
-
using TorrentDownload = Torrent;
|
|
65
|
-
|
|
66
|
-
/// Alias for BitTorrentClient (used by RatsClient API)
|
|
67
|
-
using BitTorrentClient = BtClient;
|
|
68
|
-
|
|
69
|
-
/// Alias for InfoHash (used by RatsClient API) - 20-byte hash
|
|
70
|
-
using InfoHash = BtInfoHash;
|
|
71
|
-
|
|
72
|
-
} // namespace librats
|
|
73
|
-
|
|
74
|
-
#endif // RATS_SEARCH_FEATURES
|
|
@@ -1,372 +0,0 @@
|
|
|
1
|
-
#include "bt_bitfield.h"
|
|
2
|
-
#include <algorithm>
|
|
3
|
-
#include <stdexcept>
|
|
4
|
-
#include <cstring>
|
|
5
|
-
|
|
6
|
-
namespace librats {
|
|
7
|
-
|
|
8
|
-
//=============================================================================
|
|
9
|
-
// Constructors
|
|
10
|
-
//=============================================================================
|
|
11
|
-
|
|
12
|
-
Bitfield::Bitfield() noexcept
|
|
13
|
-
: num_bits_(0) {
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
Bitfield::Bitfield(size_t num_bits, bool initial_value)
|
|
17
|
-
: num_bits_(num_bits) {
|
|
18
|
-
if (num_bits_ > 0) {
|
|
19
|
-
size_t num_words = (num_bits_ + 31) / 32;
|
|
20
|
-
data_.resize(num_words, initial_value ? 0xFFFFFFFF : 0);
|
|
21
|
-
if (initial_value) {
|
|
22
|
-
clear_trailing_bits();
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
Bitfield::Bitfield(const Bitfield& other)
|
|
28
|
-
: data_(other.data_), num_bits_(other.num_bits_) {
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
Bitfield::Bitfield(Bitfield&& other) noexcept
|
|
32
|
-
: data_(std::move(other.data_)), num_bits_(other.num_bits_) {
|
|
33
|
-
other.num_bits_ = 0;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
Bitfield& Bitfield::operator=(const Bitfield& other) {
|
|
37
|
-
if (this != &other) {
|
|
38
|
-
data_ = other.data_;
|
|
39
|
-
num_bits_ = other.num_bits_;
|
|
40
|
-
}
|
|
41
|
-
return *this;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
Bitfield& Bitfield::operator=(Bitfield&& other) noexcept {
|
|
45
|
-
if (this != &other) {
|
|
46
|
-
data_ = std::move(other.data_);
|
|
47
|
-
num_bits_ = other.num_bits_;
|
|
48
|
-
other.num_bits_ = 0;
|
|
49
|
-
}
|
|
50
|
-
return *this;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
//=============================================================================
|
|
54
|
-
// Bit Operations
|
|
55
|
-
//=============================================================================
|
|
56
|
-
|
|
57
|
-
void Bitfield::set_bit(size_t index) {
|
|
58
|
-
if (index >= num_bits_) {
|
|
59
|
-
return; // Silently ignore out-of-bounds
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
size_t word_idx = index / 32;
|
|
63
|
-
size_t bit_idx = 31 - (index % 32); // Big-endian bit order
|
|
64
|
-
data_[word_idx] |= (1U << bit_idx);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
void Bitfield::clear_bit(size_t index) {
|
|
68
|
-
if (index >= num_bits_) {
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
size_t word_idx = index / 32;
|
|
73
|
-
size_t bit_idx = 31 - (index % 32);
|
|
74
|
-
data_[word_idx] &= ~(1U << bit_idx);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
bool Bitfield::get_bit(size_t index) const {
|
|
78
|
-
if (index >= num_bits_) {
|
|
79
|
-
return false;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
size_t word_idx = index / 32;
|
|
83
|
-
size_t bit_idx = 31 - (index % 32);
|
|
84
|
-
return (data_[word_idx] & (1U << bit_idx)) != 0;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
void Bitfield::set_all() {
|
|
88
|
-
for (auto& word : data_) {
|
|
89
|
-
word = 0xFFFFFFFF;
|
|
90
|
-
}
|
|
91
|
-
clear_trailing_bits();
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
void Bitfield::clear_all() {
|
|
95
|
-
for (auto& word : data_) {
|
|
96
|
-
word = 0;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
//=============================================================================
|
|
101
|
-
// Query Operations
|
|
102
|
-
//=============================================================================
|
|
103
|
-
|
|
104
|
-
bool Bitfield::all_set() const {
|
|
105
|
-
if (num_bits_ == 0) return true;
|
|
106
|
-
|
|
107
|
-
// Check all complete words
|
|
108
|
-
size_t complete_words = num_bits_ / 32;
|
|
109
|
-
for (size_t i = 0; i < complete_words; ++i) {
|
|
110
|
-
if (data_[i] != 0xFFFFFFFF) return false;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
// Check remaining bits in last word
|
|
114
|
-
size_t remaining_bits = num_bits_ % 32;
|
|
115
|
-
if (remaining_bits > 0) {
|
|
116
|
-
uint32_t mask = 0xFFFFFFFF << (32 - remaining_bits);
|
|
117
|
-
if ((data_.back() & mask) != mask) return false;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
return true;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
bool Bitfield::none_set() const {
|
|
124
|
-
for (const auto& word : data_) {
|
|
125
|
-
if (word != 0) return false;
|
|
126
|
-
}
|
|
127
|
-
return true;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
size_t Bitfield::count() const {
|
|
131
|
-
size_t total = 0;
|
|
132
|
-
for (const auto& word : data_) {
|
|
133
|
-
total += popcount32(word);
|
|
134
|
-
}
|
|
135
|
-
return total;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
size_t Bitfield::popcount32(uint32_t x) {
|
|
139
|
-
#if defined(__GNUC__) || defined(__clang__)
|
|
140
|
-
return static_cast<size_t>(__builtin_popcount(x));
|
|
141
|
-
#elif defined(_MSC_VER)
|
|
142
|
-
return static_cast<size_t>(__popcnt(x));
|
|
143
|
-
#else
|
|
144
|
-
// Software fallback
|
|
145
|
-
x = x - ((x >> 1) & 0x55555555);
|
|
146
|
-
x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
|
|
147
|
-
x = (x + (x >> 4)) & 0x0F0F0F0F;
|
|
148
|
-
x = x + (x >> 8);
|
|
149
|
-
x = x + (x >> 16);
|
|
150
|
-
return x & 0x3F;
|
|
151
|
-
#endif
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
//=============================================================================
|
|
155
|
-
// Bitwise Operations
|
|
156
|
-
//=============================================================================
|
|
157
|
-
|
|
158
|
-
Bitfield& Bitfield::operator&=(const Bitfield& other) {
|
|
159
|
-
size_t min_words = (std::min)(data_.size(), other.data_.size());
|
|
160
|
-
for (size_t i = 0; i < min_words; ++i) {
|
|
161
|
-
data_[i] &= other.data_[i];
|
|
162
|
-
}
|
|
163
|
-
// Words beyond other's size become 0
|
|
164
|
-
for (size_t i = min_words; i < data_.size(); ++i) {
|
|
165
|
-
data_[i] = 0;
|
|
166
|
-
}
|
|
167
|
-
return *this;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
Bitfield& Bitfield::operator|=(const Bitfield& other) {
|
|
171
|
-
size_t min_words = (std::min)(data_.size(), other.data_.size());
|
|
172
|
-
for (size_t i = 0; i < min_words; ++i) {
|
|
173
|
-
data_[i] |= other.data_[i];
|
|
174
|
-
}
|
|
175
|
-
clear_trailing_bits();
|
|
176
|
-
return *this;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
Bitfield& Bitfield::operator^=(const Bitfield& other) {
|
|
180
|
-
size_t min_words = (std::min)(data_.size(), other.data_.size());
|
|
181
|
-
for (size_t i = 0; i < min_words; ++i) {
|
|
182
|
-
data_[i] ^= other.data_[i];
|
|
183
|
-
}
|
|
184
|
-
clear_trailing_bits();
|
|
185
|
-
return *this;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
Bitfield Bitfield::operator~() const {
|
|
189
|
-
Bitfield result(num_bits_);
|
|
190
|
-
for (size_t i = 0; i < data_.size(); ++i) {
|
|
191
|
-
result.data_[i] = ~data_[i];
|
|
192
|
-
}
|
|
193
|
-
result.clear_trailing_bits();
|
|
194
|
-
return result;
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
bool Bitfield::has_bits_not_in(const Bitfield& other) const {
|
|
198
|
-
size_t min_words = (std::min)(data_.size(), other.data_.size());
|
|
199
|
-
for (size_t i = 0; i < min_words; ++i) {
|
|
200
|
-
if ((data_[i] & ~other.data_[i]) != 0) return true;
|
|
201
|
-
}
|
|
202
|
-
// Check remaining words in this bitfield
|
|
203
|
-
for (size_t i = min_words; i < data_.size(); ++i) {
|
|
204
|
-
if (data_[i] != 0) return true;
|
|
205
|
-
}
|
|
206
|
-
return false;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
//=============================================================================
|
|
210
|
-
// Serialization
|
|
211
|
-
//=============================================================================
|
|
212
|
-
|
|
213
|
-
std::vector<uint8_t> Bitfield::to_bytes() const {
|
|
214
|
-
size_t byte_count = (num_bits_ + 7) / 8;
|
|
215
|
-
std::vector<uint8_t> bytes(byte_count, 0);
|
|
216
|
-
|
|
217
|
-
for (size_t i = 0; i < num_bits_; ++i) {
|
|
218
|
-
if (get_bit(i)) {
|
|
219
|
-
size_t byte_idx = i / 8;
|
|
220
|
-
size_t bit_idx = 7 - (i % 8); // Big-endian bit order within byte
|
|
221
|
-
bytes[byte_idx] |= (1 << bit_idx);
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
return bytes;
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
Bitfield Bitfield::from_bytes(const uint8_t* data, size_t data_len, size_t num_bits) {
|
|
229
|
-
Bitfield bf(num_bits);
|
|
230
|
-
|
|
231
|
-
size_t bits_to_copy = (std::min)(num_bits, data_len * 8);
|
|
232
|
-
for (size_t i = 0; i < bits_to_copy; ++i) {
|
|
233
|
-
size_t byte_idx = i / 8;
|
|
234
|
-
size_t bit_idx = 7 - (i % 8); // Big-endian bit order
|
|
235
|
-
if (data[byte_idx] & (1 << bit_idx)) {
|
|
236
|
-
bf.set_bit(i);
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
return bf;
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
Bitfield Bitfield::from_bytes(const std::vector<uint8_t>& data, size_t num_bits) {
|
|
244
|
-
return from_bytes(data.data(), data.size(), num_bits);
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
//=============================================================================
|
|
248
|
-
// Resize
|
|
249
|
-
//=============================================================================
|
|
250
|
-
|
|
251
|
-
void Bitfield::resize(size_t new_size, bool value) {
|
|
252
|
-
size_t old_size = num_bits_;
|
|
253
|
-
num_bits_ = new_size;
|
|
254
|
-
|
|
255
|
-
size_t new_words = (new_size + 31) / 32;
|
|
256
|
-
size_t old_words = data_.size();
|
|
257
|
-
|
|
258
|
-
data_.resize(new_words, value ? 0xFFFFFFFF : 0);
|
|
259
|
-
|
|
260
|
-
// If growing and value is true, set new bits
|
|
261
|
-
if (new_size > old_size && value) {
|
|
262
|
-
// Set bits from old_size to new_size
|
|
263
|
-
for (size_t i = old_size; i < new_size; ++i) {
|
|
264
|
-
set_bit(i);
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
clear_trailing_bits();
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
//=============================================================================
|
|
272
|
-
// Iteration Helpers
|
|
273
|
-
//=============================================================================
|
|
274
|
-
|
|
275
|
-
size_t Bitfield::find_first_set() const {
|
|
276
|
-
for (size_t w = 0; w < data_.size(); ++w) {
|
|
277
|
-
if (data_[w] != 0) {
|
|
278
|
-
// Find first set bit in this word
|
|
279
|
-
for (int b = 31; b >= 0; --b) {
|
|
280
|
-
size_t bit_idx = w * 32 + (31 - b);
|
|
281
|
-
if (bit_idx >= num_bits_) return num_bits_;
|
|
282
|
-
if (data_[w] & (1U << b)) {
|
|
283
|
-
return bit_idx;
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
return num_bits_;
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
size_t Bitfield::find_first_clear() const {
|
|
292
|
-
for (size_t i = 0; i < num_bits_; ++i) {
|
|
293
|
-
if (!get_bit(i)) return i;
|
|
294
|
-
}
|
|
295
|
-
return num_bits_;
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
size_t Bitfield::find_next_set(size_t start) const {
|
|
299
|
-
for (size_t i = start + 1; i < num_bits_; ++i) {
|
|
300
|
-
if (get_bit(i)) return i;
|
|
301
|
-
}
|
|
302
|
-
return num_bits_;
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
size_t Bitfield::find_next_clear(size_t start) const {
|
|
306
|
-
for (size_t i = start + 1; i < num_bits_; ++i) {
|
|
307
|
-
if (!get_bit(i)) return i;
|
|
308
|
-
}
|
|
309
|
-
return num_bits_;
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
//=============================================================================
|
|
313
|
-
// Comparison
|
|
314
|
-
//=============================================================================
|
|
315
|
-
|
|
316
|
-
bool Bitfield::operator==(const Bitfield& other) const {
|
|
317
|
-
if (num_bits_ != other.num_bits_) return false;
|
|
318
|
-
return data_ == other.data_;
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
//=============================================================================
|
|
322
|
-
// Debug
|
|
323
|
-
//=============================================================================
|
|
324
|
-
|
|
325
|
-
std::string Bitfield::to_string() const {
|
|
326
|
-
std::string result;
|
|
327
|
-
result.reserve(num_bits_);
|
|
328
|
-
for (size_t i = 0; i < num_bits_; ++i) {
|
|
329
|
-
result += get_bit(i) ? '1' : '0';
|
|
330
|
-
}
|
|
331
|
-
return result;
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
//=============================================================================
|
|
335
|
-
// Private Helpers
|
|
336
|
-
//=============================================================================
|
|
337
|
-
|
|
338
|
-
void Bitfield::clear_trailing_bits() {
|
|
339
|
-
if (num_bits_ == 0 || data_.empty()) return;
|
|
340
|
-
|
|
341
|
-
size_t trailing_bits = num_bits_ % 32;
|
|
342
|
-
if (trailing_bits > 0) {
|
|
343
|
-
// Create mask for valid bits in last word
|
|
344
|
-
// If trailing_bits = 5, we want bits 31, 30, 29, 28, 27 to be valid
|
|
345
|
-
uint32_t mask = 0xFFFFFFFF << (32 - trailing_bits);
|
|
346
|
-
data_.back() &= mask;
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
//=============================================================================
|
|
351
|
-
// Free Functions
|
|
352
|
-
//=============================================================================
|
|
353
|
-
|
|
354
|
-
Bitfield operator&(const Bitfield& a, const Bitfield& b) {
|
|
355
|
-
Bitfield result(a);
|
|
356
|
-
result &= b;
|
|
357
|
-
return result;
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
Bitfield operator|(const Bitfield& a, const Bitfield& b) {
|
|
361
|
-
Bitfield result(a);
|
|
362
|
-
result |= b;
|
|
363
|
-
return result;
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
Bitfield operator^(const Bitfield& a, const Bitfield& b) {
|
|
367
|
-
Bitfield result(a);
|
|
368
|
-
result ^= b;
|
|
369
|
-
return result;
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
} // namespace librats
|