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.
Files changed (319) hide show
  1. package/README.md +145 -331
  2. package/binding.gyp +16 -3
  3. package/lib/index.d.ts +288 -696
  4. package/lib/index.js +407 -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 +404 -179
  8. package/native-src/LICENSE +1 -1
  9. package/native-src/src/librats/bindings/rats.cpp +762 -0
  10. package/native-src/src/librats/bindings/rats.h +380 -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 +43 -0
  73. package/native-src/src/librats/core/types.h +103 -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/circuit_service.h +84 -0
  144. package/native-src/src/librats/node/config.h +110 -0
  145. package/native-src/src/librats/node/dial_service.h +54 -0
  146. package/native-src/src/librats/node/dialer.cpp +264 -0
  147. package/native-src/src/librats/node/dialer.h +188 -0
  148. package/native-src/src/librats/node/host_events.h +26 -0
  149. package/native-src/src/librats/node/identify.cpp +130 -0
  150. package/native-src/src/librats/node/identify.h +71 -0
  151. package/native-src/src/librats/node/nat_status.cpp +103 -0
  152. package/native-src/src/librats/node/nat_status.h +118 -0
  153. package/native-src/src/librats/node/node.cpp +865 -0
  154. package/native-src/src/librats/node/node.h +344 -0
  155. package/native-src/src/librats/node/node_context.h +33 -0
  156. package/native-src/src/librats/node/peer_network.h +91 -0
  157. package/native-src/src/librats/peer/peer.h +49 -0
  158. package/native-src/src/librats/peer/peer_book.cpp +181 -0
  159. package/native-src/src/librats/peer/peer_book.h +88 -0
  160. package/native-src/src/librats/peer/peer_id.cpp +72 -0
  161. package/native-src/src/librats/peer/peer_id.h +62 -0
  162. package/native-src/src/librats/peer/peer_info.h +37 -0
  163. package/native-src/src/librats/peer/peer_table.cpp +170 -0
  164. package/native-src/src/librats/peer/peer_table.h +148 -0
  165. package/native-src/src/librats/security/handshaker.h +66 -0
  166. package/native-src/src/librats/security/identity.h +43 -0
  167. package/native-src/src/librats/security/noise_security.cpp +122 -0
  168. package/native-src/src/librats/security/noise_security.h +37 -0
  169. package/native-src/src/librats/security/plaintext_security.h +106 -0
  170. package/native-src/src/librats/security/session.h +37 -0
  171. package/native-src/src/{storage.cpp → librats/storage/storage.cpp} +369 -522
  172. package/native-src/src/{storage.h → librats/storage/storage.h} +135 -299
  173. package/native-src/src/librats/subsystems/bittorrent.cpp +211 -0
  174. package/native-src/src/librats/subsystems/bittorrent.h +136 -0
  175. package/native-src/src/librats/subsystems/dht_discovery.cpp +202 -0
  176. package/native-src/src/librats/subsystems/dht_discovery.h +123 -0
  177. package/native-src/src/librats/subsystems/dht_service.h +36 -0
  178. package/native-src/src/librats/subsystems/file_transfer.cpp +972 -0
  179. package/native-src/src/librats/subsystems/file_transfer.h +367 -0
  180. package/native-src/src/librats/subsystems/hole_punch.cpp +605 -0
  181. package/native-src/src/librats/subsystems/hole_punch.h +290 -0
  182. package/native-src/src/librats/subsystems/hole_punch_service.h +38 -0
  183. package/native-src/src/librats/subsystems/mdns_discovery.cpp +66 -0
  184. package/native-src/src/librats/subsystems/mdns_discovery.h +55 -0
  185. package/native-src/src/librats/subsystems/message_json.cpp +112 -0
  186. package/native-src/src/librats/subsystems/message_json.h +88 -0
  187. package/native-src/src/librats/subsystems/peer_exchange.cpp +241 -0
  188. package/native-src/src/librats/subsystems/peer_exchange.h +136 -0
  189. package/native-src/src/librats/subsystems/ping_service.cpp +98 -0
  190. package/native-src/src/librats/subsystems/ping_service.h +66 -0
  191. package/native-src/src/librats/subsystems/port_mapping_service.cpp +192 -0
  192. package/native-src/src/librats/subsystems/port_mapping_service.h +84 -0
  193. package/native-src/src/librats/subsystems/pubsub.cpp +567 -0
  194. package/native-src/src/librats/subsystems/pubsub.h +175 -0
  195. package/native-src/src/librats/subsystems/reconnection.cpp +239 -0
  196. package/native-src/src/librats/subsystems/reconnection.h +126 -0
  197. package/native-src/src/librats/subsystems/relay.cpp +1142 -0
  198. package/native-src/src/librats/subsystems/relay.h +211 -0
  199. package/native-src/src/librats/subsystems/relay_service.h +46 -0
  200. package/native-src/src/librats/transport/connection.cpp +343 -0
  201. package/native-src/src/librats/transport/connection.h +283 -0
  202. package/native-src/src/librats/transport/link.h +96 -0
  203. package/native-src/src/librats/transport/reactor.cpp +588 -0
  204. package/native-src/src/librats/transport/reactor.h +262 -0
  205. package/native-src/src/librats/transport/reactor_pool.h +81 -0
  206. package/native-src/src/librats/transport/relay_link.cpp +208 -0
  207. package/native-src/src/librats/transport/relay_link.h +303 -0
  208. package/native-src/src/librats/transport/tcp_link.cpp +49 -0
  209. package/native-src/src/librats/transport/tcp_link.h +43 -0
  210. package/native-src/src/librats/transport/udp_mux.cpp +617 -0
  211. package/native-src/src/librats/transport/udp_mux.h +363 -0
  212. package/native-src/src/librats/transport/udp_packet.cpp +121 -0
  213. package/native-src/src/librats/transport/udp_packet.h +190 -0
  214. package/native-src/src/librats/transport/udp_stream.cpp +1194 -0
  215. package/native-src/src/librats/transport/udp_stream.h +614 -0
  216. package/native-src/src/librats/util/features.h.in +51 -0
  217. package/native-src/src/{fs.cpp → librats/util/fs.cpp} +51 -3
  218. package/native-src/src/librats/util/fs.h +136 -0
  219. package/native-src/src/librats/util/json.cpp +1002 -0
  220. package/native-src/src/librats/util/json.h +444 -0
  221. package/native-src/src/{logger.cpp → librats/util/logger.cpp} +1 -1
  222. package/native-src/src/{logger.h → librats/util/logger.h} +43 -31
  223. package/native-src/src/{network_monitor.cpp → librats/util/network_monitor.cpp} +12 -4
  224. package/native-src/src/{network_monitor.h → librats/util/network_monitor.h} +2 -1
  225. package/native-src/src/{network_utils.cpp → librats/util/network_utils.cpp} +38 -23
  226. package/native-src/src/{network_utils.h → librats/util/network_utils.h} +15 -8
  227. package/native-src/src/{os.cpp → librats/util/os.cpp} +48 -18
  228. package/native-src/src/librats/util/rats_export.h +69 -0
  229. package/native-src/src/{version.cpp → librats/util/version.cpp} +2 -2
  230. package/native-src/src/{version.h.in → librats/util/version.h.in} +1 -1
  231. package/native-src/src/librats/wire/frame.cpp +76 -0
  232. package/native-src/src/librats/wire/frame.h +111 -0
  233. package/native-src/src/librats/wire/message_router.cpp +45 -0
  234. package/native-src/src/librats/wire/message_router.h +47 -0
  235. package/package.json +5 -4
  236. package/scripts/build-librats.js +1 -0
  237. package/scripts/postinstall.js +3 -3
  238. package/scripts/prepare-package.js +4 -4
  239. package/scripts/verify-installation.js +63 -105
  240. package/src/librats_node.cpp +1067 -1323
  241. package/native-src/src/bencode.cpp +0 -485
  242. package/native-src/src/bencode.h +0 -145
  243. package/native-src/src/bittorrent.cpp +0 -14
  244. package/native-src/src/bittorrent.h +0 -74
  245. package/native-src/src/bt_bitfield.cpp +0 -372
  246. package/native-src/src/bt_bitfield.h +0 -316
  247. package/native-src/src/bt_choker.cpp +0 -228
  248. package/native-src/src/bt_choker.h +0 -147
  249. package/native-src/src/bt_client.cpp +0 -1047
  250. package/native-src/src/bt_client.h +0 -445
  251. package/native-src/src/bt_create_torrent.cpp +0 -677
  252. package/native-src/src/bt_create_torrent.h +0 -473
  253. package/native-src/src/bt_extension.cpp +0 -469
  254. package/native-src/src/bt_extension.h +0 -309
  255. package/native-src/src/bt_file_storage.cpp +0 -261
  256. package/native-src/src/bt_file_storage.h +0 -298
  257. package/native-src/src/bt_handshake.cpp +0 -134
  258. package/native-src/src/bt_handshake.h +0 -157
  259. package/native-src/src/bt_messages.cpp +0 -364
  260. package/native-src/src/bt_messages.h +0 -324
  261. package/native-src/src/bt_network.cpp +0 -1007
  262. package/native-src/src/bt_network.h +0 -417
  263. package/native-src/src/bt_peer_connection.cpp +0 -742
  264. package/native-src/src/bt_peer_connection.h +0 -592
  265. package/native-src/src/bt_piece_picker.cpp +0 -786
  266. package/native-src/src/bt_piece_picker.h +0 -473
  267. package/native-src/src/bt_resume_data.cpp +0 -410
  268. package/native-src/src/bt_resume_data.h +0 -249
  269. package/native-src/src/bt_torrent.cpp +0 -2120
  270. package/native-src/src/bt_torrent.h +0 -641
  271. package/native-src/src/bt_torrent_info.cpp +0 -659
  272. package/native-src/src/bt_torrent_info.h +0 -418
  273. package/native-src/src/bt_types.h +0 -621
  274. package/native-src/src/chained_send_buffer.cpp +0 -75
  275. package/native-src/src/chained_send_buffer.h +0 -137
  276. package/native-src/src/crypto/hkdf.c +0 -266
  277. package/native-src/src/crypto/poly1305.h +0 -36
  278. package/native-src/src/dht.cpp +0 -3311
  279. package/native-src/src/dht.h +0 -717
  280. package/native-src/src/disk_io.cpp +0 -632
  281. package/native-src/src/disk_io.h +0 -315
  282. package/native-src/src/file_transfer.cpp +0 -1415
  283. package/native-src/src/file_transfer.h +0 -286
  284. package/native-src/src/fs.h +0 -108
  285. package/native-src/src/gossipsub.cpp +0 -1139
  286. package/native-src/src/gossipsub.h +0 -403
  287. package/native-src/src/ice.cpp +0 -893
  288. package/native-src/src/ice.h +0 -559
  289. package/native-src/src/json.hpp +0 -25526
  290. package/native-src/src/librats.cpp +0 -2378
  291. package/native-src/src/librats.h +0 -2324
  292. package/native-src/src/librats_bittorrent.cpp +0 -601
  293. package/native-src/src/librats_c.cpp +0 -1557
  294. package/native-src/src/librats_c.h +0 -323
  295. package/native-src/src/librats_discovery.cpp +0 -402
  296. package/native-src/src/librats_encryption.cpp +0 -275
  297. package/native-src/src/librats_file_transfer.cpp +0 -144
  298. package/native-src/src/librats_gossipsub.cpp +0 -289
  299. package/native-src/src/librats_ice.cpp +0 -213
  300. package/native-src/src/librats_log_macros.h +0 -36
  301. package/native-src/src/librats_logging.cpp +0 -173
  302. package/native-src/src/librats_mdns.cpp +0 -166
  303. package/native-src/src/librats_persistence.cpp +0 -796
  304. package/native-src/src/librats_portmap.cpp +0 -419
  305. package/native-src/src/librats_reconnection.cpp +0 -218
  306. package/native-src/src/librats_statistic.cpp +0 -105
  307. package/native-src/src/librats_storage.cpp +0 -189
  308. package/native-src/src/rats_export.h +0 -17
  309. package/native-src/src/receive_buffer.cpp +0 -82
  310. package/native-src/src/receive_buffer.h +0 -127
  311. package/native-src/src/socket.h +0 -228
  312. package/native-src/src/threadmanager.cpp +0 -105
  313. package/native-src/src/threadmanager.h +0 -53
  314. package/native-src/src/tracker.cpp +0 -1264
  315. package/native-src/src/tracker.h +0 -319
  316. package/native-src/src/turn.cpp +0 -762
  317. package/native-src/src/turn.h +0 -460
  318. package/native-src/src/wakeup_pipe.h +0 -60
  319. /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