librats 1.0.2 → 2.1.4

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.
Files changed (313) hide show
  1. package/README.md +137 -332
  2. package/binding.gyp +16 -3
  3. package/lib/index.d.ts +271 -696
  4. package/lib/index.js +383 -44
  5. package/native-src/3rdparty/android/ifaddrs-android.c +1 -0
  6. package/native-src/3rdparty/android/ifaddrs-android.h +1 -0
  7. package/native-src/CMakeLists.txt +396 -179
  8. package/native-src/LICENSE +1 -1
  9. package/native-src/src/librats/bindings/rats.cpp +731 -0
  10. package/native-src/src/librats/bindings/rats.h +352 -0
  11. package/native-src/src/librats/bittorrent/bencode.cpp +437 -0
  12. package/native-src/src/librats/bittorrent/bencode.h +176 -0
  13. package/native-src/src/librats/bittorrent/bitfield.cpp +97 -0
  14. package/native-src/src/librats/bittorrent/bitfield.h +76 -0
  15. package/native-src/src/librats/bittorrent/byte_io.h +58 -0
  16. package/native-src/src/librats/bittorrent/choker.cpp +25 -0
  17. package/native-src/src/librats/bittorrent/choker.h +46 -0
  18. package/native-src/src/librats/bittorrent/client.cpp +413 -0
  19. package/native-src/src/librats/bittorrent/client.h +227 -0
  20. package/native-src/src/librats/bittorrent/disk_io.cpp +209 -0
  21. package/native-src/src/librats/bittorrent/disk_io.h +150 -0
  22. package/native-src/src/librats/bittorrent/extensions.cpp +191 -0
  23. package/native-src/src/librats/bittorrent/extensions.h +94 -0
  24. package/native-src/src/librats/bittorrent/file_storage.cpp +77 -0
  25. package/native-src/src/librats/bittorrent/file_storage.h +79 -0
  26. package/native-src/src/librats/bittorrent/log.h +42 -0
  27. package/native-src/src/librats/bittorrent/magnet_uri.cpp +98 -0
  28. package/native-src/src/librats/bittorrent/magnet_uri.h +35 -0
  29. package/native-src/src/librats/bittorrent/peer_connection.cpp +502 -0
  30. package/native-src/src/librats/bittorrent/peer_connection.h +194 -0
  31. package/native-src/src/librats/bittorrent/peer_list.cpp +68 -0
  32. package/native-src/src/librats/bittorrent/peer_list.h +75 -0
  33. package/native-src/src/librats/bittorrent/piece_picker.cpp +352 -0
  34. package/native-src/src/librats/bittorrent/piece_picker.h +201 -0
  35. package/native-src/src/librats/bittorrent/reactor.cpp +97 -0
  36. package/native-src/src/librats/bittorrent/reactor.h +89 -0
  37. package/native-src/src/librats/bittorrent/resume_data.cpp +72 -0
  38. package/native-src/src/librats/bittorrent/resume_data.h +41 -0
  39. package/native-src/src/librats/bittorrent/store_buffer.cpp +48 -0
  40. package/native-src/src/librats/bittorrent/store_buffer.h +47 -0
  41. package/native-src/src/librats/bittorrent/torrent.cpp +870 -0
  42. package/native-src/src/librats/bittorrent/torrent.h +260 -0
  43. package/native-src/src/librats/bittorrent/torrent_creator.cpp +129 -0
  44. package/native-src/src/librats/bittorrent/torrent_creator.h +58 -0
  45. package/native-src/src/librats/bittorrent/torrent_info.cpp +314 -0
  46. package/native-src/src/librats/bittorrent/torrent_info.h +118 -0
  47. package/native-src/src/librats/bittorrent/tracker.cpp +374 -0
  48. package/native-src/src/librats/bittorrent/tracker.h +108 -0
  49. package/native-src/src/librats/bittorrent/types.cpp +206 -0
  50. package/native-src/src/librats/bittorrent/types.h +86 -0
  51. package/native-src/src/librats/core/address.cpp +35 -0
  52. package/native-src/src/librats/core/address.h +78 -0
  53. package/native-src/src/librats/core/bytes.h +69 -0
  54. package/native-src/src/librats/core/chained_send_buffer.cpp +172 -0
  55. package/native-src/src/librats/core/chained_send_buffer.h +183 -0
  56. package/native-src/src/librats/core/endpoint_parse.cpp +41 -0
  57. package/native-src/src/librats/core/endpoint_parse.h +31 -0
  58. package/native-src/src/librats/core/event_bus.h +70 -0
  59. package/native-src/src/librats/core/host_endpoint.h +56 -0
  60. package/native-src/src/{io_poller.cpp → librats/core/io_poller.cpp} +520 -65
  61. package/native-src/src/{io_poller.h → librats/core/io_poller.h} +12 -6
  62. package/native-src/src/librats/core/ip_address.cpp +120 -0
  63. package/native-src/src/librats/core/ip_address.h +109 -0
  64. package/native-src/src/librats/core/mpsc_queue.h +47 -0
  65. package/native-src/src/librats/core/notifier.h +74 -0
  66. package/native-src/src/librats/core/receive_buffer.cpp +219 -0
  67. package/native-src/src/librats/core/receive_buffer.h +171 -0
  68. package/native-src/src/librats/core/service_registry.h +58 -0
  69. package/native-src/src/{socket.cpp → librats/core/socket.cpp} +625 -118
  70. package/native-src/src/librats/core/socket.h +496 -0
  71. package/native-src/src/librats/core/timer_queue.h +105 -0
  72. package/native-src/src/librats/core/types.cpp +42 -0
  73. package/native-src/src/librats/core/types.h +93 -0
  74. package/native-src/src/librats/core/wakeup_pipe.h +83 -0
  75. package/native-src/src/{crypto → librats/crypto}/blake2_endian.h +21 -23
  76. package/native-src/src/{crypto → librats/crypto}/blake2b.c +34 -33
  77. package/native-src/src/{crypto → librats/crypto}/blake2b.h +7 -6
  78. package/native-src/src/{crypto → librats/crypto}/blake2s.c +55 -54
  79. package/native-src/src/{crypto → librats/crypto}/blake2s.h +13 -12
  80. package/native-src/src/{crypto → librats/crypto}/chacha.c +22 -21
  81. package/native-src/src/{crypto → librats/crypto}/chacha.h +14 -13
  82. package/native-src/src/{crypto → librats/crypto}/chachapoly.c +56 -56
  83. package/native-src/src/{crypto → librats/crypto}/chachapoly.h +24 -17
  84. package/native-src/src/{crc32.cpp → librats/crypto/crc32.cpp} +1 -1
  85. package/native-src/src/{crc32.h → librats/crypto/crc32.h} +3 -1
  86. package/native-src/src/{crypto → librats/crypto}/curve25519.c +6 -4
  87. package/native-src/src/{crypto → librats/crypto}/curve25519.h +6 -3
  88. package/native-src/src/librats/crypto/hkdf.c +266 -0
  89. package/native-src/src/{crypto → librats/crypto}/hkdf.h +19 -19
  90. package/native-src/src/{noise.cpp → librats/crypto/noise.cpp} +84 -73
  91. package/native-src/src/{noise.h → librats/crypto/noise.h} +18 -8
  92. package/native-src/src/{crypto → librats/crypto}/poly1305.c +47 -46
  93. package/native-src/src/librats/crypto/poly1305.h +37 -0
  94. package/native-src/src/{sha1.cpp → librats/crypto/sha1.cpp} +33 -1
  95. package/native-src/src/{sha1.h → librats/crypto/sha1.h} +14 -6
  96. package/native-src/src/{crypto → librats/crypto}/sha256.c +15 -14
  97. package/native-src/src/{crypto → librats/crypto}/sha256.h +8 -7
  98. package/native-src/src/{crypto → librats/crypto}/sha512.c +15 -14
  99. package/native-src/src/{crypto → librats/crypto}/sha512.h +8 -7
  100. package/native-src/src/librats/dht/announce.cpp +37 -0
  101. package/native-src/src/librats/dht/announce.h +41 -0
  102. package/native-src/src/librats/dht/bep42.cpp +109 -0
  103. package/native-src/src/librats/dht/bep42.h +48 -0
  104. package/native-src/src/librats/dht/dht.cpp +501 -0
  105. package/native-src/src/librats/dht/dht.h +119 -0
  106. package/native-src/src/librats/dht/dht_runner.cpp +103 -0
  107. package/native-src/src/librats/dht/dht_runner.h +71 -0
  108. package/native-src/src/librats/dht/dos_blocker.cpp +42 -0
  109. package/native-src/src/librats/dht/dos_blocker.h +47 -0
  110. package/native-src/src/librats/dht/find_peers.cpp +52 -0
  111. package/native-src/src/librats/dht/find_peers.h +73 -0
  112. package/native-src/src/librats/dht/id.h +167 -0
  113. package/native-src/src/{krpc.cpp → librats/dht/krpc.cpp} +32 -81
  114. package/native-src/src/{krpc.h → librats/dht/krpc.h} +19 -23
  115. package/native-src/src/librats/dht/log.h +38 -0
  116. package/native-src/src/librats/dht/node.cpp +473 -0
  117. package/native-src/src/librats/dht/node.h +164 -0
  118. package/native-src/src/librats/dht/node_entry.h +81 -0
  119. package/native-src/src/librats/dht/observer.h +72 -0
  120. package/native-src/src/librats/dht/persistence.cpp +90 -0
  121. package/native-src/src/librats/dht/persistence.h +32 -0
  122. package/native-src/src/librats/dht/routing_table.cpp +559 -0
  123. package/native-src/src/librats/dht/routing_table.h +185 -0
  124. package/native-src/src/librats/dht/rpc_manager.cpp +127 -0
  125. package/native-src/src/librats/dht/rpc_manager.h +77 -0
  126. package/native-src/src/librats/dht/storage.cpp +92 -0
  127. package/native-src/src/librats/dht/storage.h +74 -0
  128. package/native-src/src/librats/dht/transport.h +27 -0
  129. package/native-src/src/librats/dht/traversal.cpp +326 -0
  130. package/native-src/src/librats/dht/traversal.h +120 -0
  131. package/native-src/src/librats/dht/udp_transport.cpp +49 -0
  132. package/native-src/src/librats/dht/udp_transport.h +51 -0
  133. package/native-src/src/librats/mdns/log.h +22 -0
  134. package/native-src/src/{mdns.cpp → librats/mdns/mdns.cpp} +75 -40
  135. package/native-src/src/{mdns.h → librats/mdns/mdns.h} +9 -8
  136. package/native-src/src/{natpmp.cpp → librats/nat/natpmp.cpp} +12 -9
  137. package/native-src/src/{natpmp.h → librats/nat/natpmp.h} +3 -3
  138. package/native-src/src/{port_mapping.h → librats/nat/port_mapping.h} +3 -2
  139. package/native-src/src/{stun.cpp → librats/nat/stun.cpp} +4 -4
  140. package/native-src/src/{stun.h → librats/nat/stun.h} +1 -1
  141. package/native-src/src/{upnp.cpp → librats/nat/upnp.cpp} +6 -6
  142. package/native-src/src/{upnp.h → librats/nat/upnp.h} +2 -2
  143. package/native-src/src/librats/node/config.h +110 -0
  144. package/native-src/src/librats/node/dial_service.h +54 -0
  145. package/native-src/src/librats/node/dialer.cpp +264 -0
  146. package/native-src/src/librats/node/dialer.h +188 -0
  147. package/native-src/src/librats/node/host_events.h +26 -0
  148. package/native-src/src/librats/node/identify.cpp +130 -0
  149. package/native-src/src/librats/node/identify.h +71 -0
  150. package/native-src/src/librats/node/nat_status.cpp +103 -0
  151. package/native-src/src/librats/node/nat_status.h +118 -0
  152. package/native-src/src/librats/node/node.cpp +826 -0
  153. package/native-src/src/librats/node/node.h +333 -0
  154. package/native-src/src/librats/node/node_context.h +33 -0
  155. package/native-src/src/librats/node/peer_network.h +91 -0
  156. package/native-src/src/librats/peer/peer.h +49 -0
  157. package/native-src/src/librats/peer/peer_book.cpp +181 -0
  158. package/native-src/src/librats/peer/peer_book.h +88 -0
  159. package/native-src/src/librats/peer/peer_id.cpp +72 -0
  160. package/native-src/src/librats/peer/peer_id.h +62 -0
  161. package/native-src/src/librats/peer/peer_info.h +37 -0
  162. package/native-src/src/librats/peer/peer_table.cpp +137 -0
  163. package/native-src/src/librats/peer/peer_table.h +148 -0
  164. package/native-src/src/librats/security/handshaker.h +66 -0
  165. package/native-src/src/librats/security/identity.h +43 -0
  166. package/native-src/src/librats/security/noise_security.cpp +122 -0
  167. package/native-src/src/librats/security/noise_security.h +37 -0
  168. package/native-src/src/librats/security/plaintext_security.h +106 -0
  169. package/native-src/src/librats/security/session.h +37 -0
  170. package/native-src/src/{storage.cpp → librats/storage/storage.cpp} +369 -522
  171. package/native-src/src/{storage.h → librats/storage/storage.h} +135 -299
  172. package/native-src/src/librats/subsystems/bittorrent.cpp +211 -0
  173. package/native-src/src/librats/subsystems/bittorrent.h +136 -0
  174. package/native-src/src/librats/subsystems/dht_discovery.cpp +202 -0
  175. package/native-src/src/librats/subsystems/dht_discovery.h +123 -0
  176. package/native-src/src/librats/subsystems/dht_service.h +36 -0
  177. package/native-src/src/librats/subsystems/file_transfer.cpp +972 -0
  178. package/native-src/src/librats/subsystems/file_transfer.h +367 -0
  179. package/native-src/src/librats/subsystems/hole_punch.cpp +532 -0
  180. package/native-src/src/librats/subsystems/hole_punch.h +266 -0
  181. package/native-src/src/librats/subsystems/hole_punch_service.h +38 -0
  182. package/native-src/src/librats/subsystems/mdns_discovery.cpp +66 -0
  183. package/native-src/src/librats/subsystems/mdns_discovery.h +55 -0
  184. package/native-src/src/librats/subsystems/message_json.cpp +112 -0
  185. package/native-src/src/librats/subsystems/message_json.h +88 -0
  186. package/native-src/src/librats/subsystems/peer_exchange.cpp +241 -0
  187. package/native-src/src/librats/subsystems/peer_exchange.h +136 -0
  188. package/native-src/src/librats/subsystems/ping_service.cpp +98 -0
  189. package/native-src/src/librats/subsystems/ping_service.h +66 -0
  190. package/native-src/src/librats/subsystems/port_mapping_service.cpp +192 -0
  191. package/native-src/src/librats/subsystems/port_mapping_service.h +84 -0
  192. package/native-src/src/librats/subsystems/pubsub.cpp +567 -0
  193. package/native-src/src/librats/subsystems/pubsub.h +175 -0
  194. package/native-src/src/librats/subsystems/reconnection.cpp +239 -0
  195. package/native-src/src/librats/subsystems/reconnection.h +126 -0
  196. package/native-src/src/librats/transport/connection.cpp +343 -0
  197. package/native-src/src/librats/transport/connection.h +283 -0
  198. package/native-src/src/librats/transport/link.h +96 -0
  199. package/native-src/src/librats/transport/reactor.cpp +540 -0
  200. package/native-src/src/librats/transport/reactor.h +224 -0
  201. package/native-src/src/librats/transport/reactor_pool.h +81 -0
  202. package/native-src/src/librats/transport/tcp_link.cpp +49 -0
  203. package/native-src/src/librats/transport/tcp_link.h +43 -0
  204. package/native-src/src/librats/transport/udp_mux.cpp +617 -0
  205. package/native-src/src/librats/transport/udp_mux.h +363 -0
  206. package/native-src/src/librats/transport/udp_packet.cpp +121 -0
  207. package/native-src/src/librats/transport/udp_packet.h +190 -0
  208. package/native-src/src/librats/transport/udp_stream.cpp +1194 -0
  209. package/native-src/src/librats/transport/udp_stream.h +614 -0
  210. package/native-src/src/librats/util/features.h.in +51 -0
  211. package/native-src/src/{fs.cpp → librats/util/fs.cpp} +51 -3
  212. package/native-src/src/librats/util/fs.h +136 -0
  213. package/native-src/src/librats/util/json.cpp +1002 -0
  214. package/native-src/src/librats/util/json.h +444 -0
  215. package/native-src/src/{logger.cpp → librats/util/logger.cpp} +1 -1
  216. package/native-src/src/{logger.h → librats/util/logger.h} +43 -31
  217. package/native-src/src/{network_monitor.cpp → librats/util/network_monitor.cpp} +12 -4
  218. package/native-src/src/{network_monitor.h → librats/util/network_monitor.h} +2 -1
  219. package/native-src/src/{network_utils.cpp → librats/util/network_utils.cpp} +38 -23
  220. package/native-src/src/{network_utils.h → librats/util/network_utils.h} +15 -8
  221. package/native-src/src/{os.cpp → librats/util/os.cpp} +48 -18
  222. package/native-src/src/librats/util/rats_export.h +69 -0
  223. package/native-src/src/{version.cpp → librats/util/version.cpp} +2 -2
  224. package/native-src/src/{version.h.in → librats/util/version.h.in} +1 -1
  225. package/native-src/src/librats/wire/frame.cpp +76 -0
  226. package/native-src/src/librats/wire/frame.h +110 -0
  227. package/native-src/src/librats/wire/message_router.cpp +45 -0
  228. package/native-src/src/librats/wire/message_router.h +47 -0
  229. package/package.json +5 -4
  230. package/scripts/build-librats.js +1 -0
  231. package/scripts/postinstall.js +3 -3
  232. package/scripts/prepare-package.js +4 -4
  233. package/scripts/verify-installation.js +63 -105
  234. package/src/librats_node.cpp +1042 -1324
  235. package/native-src/src/bencode.cpp +0 -485
  236. package/native-src/src/bencode.h +0 -145
  237. package/native-src/src/bittorrent.cpp +0 -14
  238. package/native-src/src/bittorrent.h +0 -74
  239. package/native-src/src/bt_bitfield.cpp +0 -372
  240. package/native-src/src/bt_bitfield.h +0 -316
  241. package/native-src/src/bt_choker.cpp +0 -228
  242. package/native-src/src/bt_choker.h +0 -147
  243. package/native-src/src/bt_client.cpp +0 -1047
  244. package/native-src/src/bt_client.h +0 -445
  245. package/native-src/src/bt_create_torrent.cpp +0 -677
  246. package/native-src/src/bt_create_torrent.h +0 -473
  247. package/native-src/src/bt_extension.cpp +0 -469
  248. package/native-src/src/bt_extension.h +0 -309
  249. package/native-src/src/bt_file_storage.cpp +0 -261
  250. package/native-src/src/bt_file_storage.h +0 -298
  251. package/native-src/src/bt_handshake.cpp +0 -134
  252. package/native-src/src/bt_handshake.h +0 -157
  253. package/native-src/src/bt_messages.cpp +0 -364
  254. package/native-src/src/bt_messages.h +0 -324
  255. package/native-src/src/bt_network.cpp +0 -1007
  256. package/native-src/src/bt_network.h +0 -417
  257. package/native-src/src/bt_peer_connection.cpp +0 -742
  258. package/native-src/src/bt_peer_connection.h +0 -592
  259. package/native-src/src/bt_piece_picker.cpp +0 -786
  260. package/native-src/src/bt_piece_picker.h +0 -473
  261. package/native-src/src/bt_resume_data.cpp +0 -410
  262. package/native-src/src/bt_resume_data.h +0 -249
  263. package/native-src/src/bt_torrent.cpp +0 -2120
  264. package/native-src/src/bt_torrent.h +0 -641
  265. package/native-src/src/bt_torrent_info.cpp +0 -659
  266. package/native-src/src/bt_torrent_info.h +0 -418
  267. package/native-src/src/bt_types.h +0 -621
  268. package/native-src/src/chained_send_buffer.cpp +0 -75
  269. package/native-src/src/chained_send_buffer.h +0 -137
  270. package/native-src/src/crypto/hkdf.c +0 -266
  271. package/native-src/src/crypto/poly1305.h +0 -36
  272. package/native-src/src/dht.cpp +0 -3311
  273. package/native-src/src/dht.h +0 -717
  274. package/native-src/src/disk_io.cpp +0 -632
  275. package/native-src/src/disk_io.h +0 -315
  276. package/native-src/src/file_transfer.cpp +0 -1415
  277. package/native-src/src/file_transfer.h +0 -286
  278. package/native-src/src/fs.h +0 -108
  279. package/native-src/src/gossipsub.cpp +0 -1139
  280. package/native-src/src/gossipsub.h +0 -403
  281. package/native-src/src/ice.cpp +0 -893
  282. package/native-src/src/ice.h +0 -559
  283. package/native-src/src/json.hpp +0 -25526
  284. package/native-src/src/librats.cpp +0 -2378
  285. package/native-src/src/librats.h +0 -2324
  286. package/native-src/src/librats_bittorrent.cpp +0 -601
  287. package/native-src/src/librats_c.cpp +0 -1557
  288. package/native-src/src/librats_c.h +0 -323
  289. package/native-src/src/librats_discovery.cpp +0 -402
  290. package/native-src/src/librats_encryption.cpp +0 -275
  291. package/native-src/src/librats_file_transfer.cpp +0 -144
  292. package/native-src/src/librats_gossipsub.cpp +0 -289
  293. package/native-src/src/librats_ice.cpp +0 -213
  294. package/native-src/src/librats_log_macros.h +0 -36
  295. package/native-src/src/librats_logging.cpp +0 -173
  296. package/native-src/src/librats_mdns.cpp +0 -166
  297. package/native-src/src/librats_persistence.cpp +0 -796
  298. package/native-src/src/librats_portmap.cpp +0 -419
  299. package/native-src/src/librats_reconnection.cpp +0 -218
  300. package/native-src/src/librats_statistic.cpp +0 -105
  301. package/native-src/src/librats_storage.cpp +0 -189
  302. package/native-src/src/rats_export.h +0 -17
  303. package/native-src/src/receive_buffer.cpp +0 -82
  304. package/native-src/src/receive_buffer.h +0 -127
  305. package/native-src/src/socket.h +0 -228
  306. package/native-src/src/threadmanager.cpp +0 -105
  307. package/native-src/src/threadmanager.h +0 -53
  308. package/native-src/src/tracker.cpp +0 -1264
  309. package/native-src/src/tracker.h +0 -319
  310. package/native-src/src/turn.cpp +0 -762
  311. package/native-src/src/turn.h +0 -460
  312. package/native-src/src/wakeup_pipe.h +0 -60
  313. /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