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,445 +0,0 @@
1
- #pragma once
2
-
3
- /**
4
- * @file bt_client.h
5
- * @brief BitTorrent client manager
6
- *
7
- * High-level interface for managing multiple torrents,
8
- * listening for connections, and coordinating DHT/trackers.
9
- */
10
-
11
- #include "bt_types.h"
12
- #include "bt_torrent.h"
13
- #include "bt_torrent_info.h"
14
- #include "bt_resume_data.h"
15
- #include "bt_network.h"
16
- #include "dht.h"
17
-
18
- #include <memory>
19
- #include <vector>
20
- #include <unordered_map>
21
- #include <mutex>
22
- #include <atomic>
23
- #include <functional>
24
- #include <thread>
25
-
26
- namespace librats {
27
-
28
- // Forward declarations
29
- class TrackerManager;
30
-
31
- //=============================================================================
32
- // Client Configuration
33
- //=============================================================================
34
-
35
- /**
36
- * @brief Configuration for the BitTorrent client
37
- */
38
- struct BtClientConfig {
39
- std::string download_path; ///< Default download directory
40
- std::string resume_data_path; ///< Directory for resume data files (if empty, uses download_path)
41
- uint16_t listen_port; ///< Port for incoming connections (0 = random)
42
- size_t max_connections; ///< Global max connections
43
- size_t max_connections_per_torrent; ///< Max connections per torrent
44
- size_t max_uploads; ///< Max upload slots per torrent
45
- uint64_t download_limit; ///< Global download limit (bytes/sec, 0 = unlimited)
46
- uint64_t upload_limit; ///< Global upload limit (bytes/sec, 0 = unlimited)
47
- bool enable_dht; ///< Enable DHT
48
- bool enable_pex; ///< Enable peer exchange
49
- bool enable_lsd; ///< Enable local service discovery
50
- std::string user_agent; ///< Client user agent string
51
-
52
- BtClientConfig()
53
- : listen_port(6881)
54
- , max_connections(200)
55
- , max_connections_per_torrent(50)
56
- , max_uploads(4)
57
- , download_limit(0)
58
- , upload_limit(0)
59
- , enable_dht(true)
60
- , enable_pex(true)
61
- , enable_lsd(true)
62
- , user_agent("librats/1.0") {}
63
- };
64
-
65
- //=============================================================================
66
- // BitTorrent Client
67
- //=============================================================================
68
-
69
- /**
70
- * @brief High-level BitTorrent client
71
- *
72
- * Manages:
73
- * - Multiple torrents
74
- * - Incoming peer connections
75
- * - DHT node
76
- * - Tracker management
77
- * - Global rate limiting
78
- *
79
- * Thread-safe: All public methods are protected.
80
- */
81
- class BtClient {
82
- public:
83
- //=========================================================================
84
- // Types
85
- //=========================================================================
86
-
87
- using TorrentAddedCallback = std::function<void(Torrent::Ptr)>;
88
- using TorrentRemovedCallback = std::function<void(const BtInfoHash&)>;
89
- using AlertCallback = std::function<void(const std::string&)>;
90
-
91
- //=========================================================================
92
- // Construction
93
- //=========================================================================
94
-
95
- /**
96
- * @brief Create a client with default config
97
- */
98
- BtClient();
99
-
100
- /**
101
- * @brief Create a client with custom config
102
- */
103
- explicit BtClient(const BtClientConfig& config);
104
-
105
- /**
106
- * @brief Destructor - stops all torrents
107
- */
108
- ~BtClient();
109
-
110
- // Non-copyable
111
- BtClient(const BtClient&) = delete;
112
- BtClient& operator=(const BtClient&) = delete;
113
-
114
- //=========================================================================
115
- // Lifecycle
116
- //=========================================================================
117
-
118
- /**
119
- * @brief Start the client
120
- *
121
- * Begins listening for connections and starts DHT if enabled.
122
- */
123
- void start();
124
-
125
- /**
126
- * @brief Stop the client
127
- *
128
- * Stops all torrents and closes connections.
129
- */
130
- void stop();
131
-
132
- /**
133
- * @brief Check if client is running
134
- */
135
- bool is_running() const { return running_; }
136
-
137
- //=========================================================================
138
- // Torrent Management
139
- //=========================================================================
140
-
141
- /**
142
- * @brief Set the resume data path for all new torrents
143
- *
144
- * @param path Directory where resume data files will be stored
145
- */
146
- void set_resume_data_path(const std::string& path);
147
-
148
- /**
149
- * @brief Add a torrent from a .torrent file
150
- *
151
- * @param path Path to .torrent file
152
- * @param save_path Directory to save files (empty = use default)
153
- * @return Torrent pointer, or nullptr on failure
154
- */
155
- Torrent::Ptr add_torrent_file(const std::string& path,
156
- const std::string& save_path = "");
157
-
158
- /**
159
- * @brief Add a torrent from TorrentInfo
160
- *
161
- * @param info Torrent metadata
162
- * @param save_path Directory to save files
163
- * @return Torrent pointer
164
- */
165
- Torrent::Ptr add_torrent(const TorrentInfo& info,
166
- const std::string& save_path = "");
167
-
168
- /**
169
- * @brief Add a torrent from magnet link
170
- *
171
- * @param magnet_uri Magnet URI
172
- * @param save_path Directory to save files
173
- * @param skip_dht_search If true, don't search DHT for peers (for metadata-only from specific peer)
174
- * @return Torrent pointer, or nullptr on failure
175
- */
176
- Torrent::Ptr add_magnet(const std::string& magnet_uri,
177
- const std::string& save_path = "",
178
- bool skip_dht_search = false);
179
-
180
- /**
181
- * @brief Add a torrent with resume data for fast resume
182
- *
183
- * @param info Torrent metadata
184
- * @param resume_data Resume data from previous session
185
- * @param save_path Directory to save files (uses resume_data.save_path if empty)
186
- * @return Torrent pointer
187
- */
188
- Torrent::Ptr add_torrent_with_resume(
189
- const TorrentInfo& info,
190
- const TorrentResumeData& resume_data,
191
- const std::string& save_path = "");
192
-
193
- /**
194
- * @brief Add a torrent and try to load resume data automatically
195
- *
196
- * Looks for resume data in {save_path}/.resume/{info_hash}.resume
197
- * If found, applies it for fast resume. Otherwise, starts fresh.
198
- *
199
- * @param info Torrent metadata
200
- * @param save_path Directory to save files
201
- * @param check_files If true and no resume data, verify existing files
202
- * @return Torrent pointer
203
- */
204
- Torrent::Ptr add_torrent_auto_resume(
205
- const TorrentInfo& info,
206
- const std::string& save_path = "",
207
- bool check_files = true);
208
-
209
- /**
210
- * @brief Add a torrent for seeding (seed_mode)
211
- *
212
- * Use this when you have created a torrent from existing files and want to
213
- * start seeding immediately. All pieces are assumed to be complete.
214
- *
215
- * This is the correct method to use after create_torrent_from_path().
216
- *
217
- * @param info Torrent metadata (from create_torrent_from_path or similar)
218
- * @param save_path Directory where files are located
219
- * @return Torrent pointer
220
- */
221
- Torrent::Ptr add_torrent_for_seeding(
222
- const TorrentInfo& info,
223
- const std::string& save_path);
224
-
225
- /**
226
- * @brief Save resume data for all active torrents
227
- *
228
- * Call this periodically or before shutdown to save progress.
229
- */
230
- void save_all_resume_data();
231
-
232
- /**
233
- * @brief Remove a torrent
234
- *
235
- * @param info_hash Info hash of torrent to remove
236
- * @param delete_files Also delete downloaded files
237
- */
238
- void remove_torrent(const BtInfoHash& info_hash, bool delete_files = false);
239
-
240
- /**
241
- * @brief Mark a torrent for deferred removal
242
- *
243
- * Thread-safe method that can be called from any thread/callback.
244
- * The actual removal happens in the tick loop to avoid deadlocks.
245
- *
246
- * @param info_hash Info hash of torrent to remove
247
- */
248
- void mark_for_removal(const BtInfoHash& info_hash);
249
-
250
- /**
251
- * @brief Get a torrent by info hash
252
- */
253
- Torrent::Ptr get_torrent(const BtInfoHash& info_hash);
254
-
255
- /**
256
- * @brief Get all torrents
257
- */
258
- std::vector<Torrent::Ptr> get_torrents();
259
-
260
- /**
261
- * @brief Get number of torrents
262
- */
263
- size_t num_torrents() const;
264
-
265
- //=========================================================================
266
- // Configuration
267
- //=========================================================================
268
-
269
- /**
270
- * @brief Get current configuration
271
- */
272
- const BtClientConfig& config() const { return config_; }
273
-
274
- /**
275
- * @brief Set global download limit
276
- */
277
- void set_download_limit(uint64_t bytes_per_sec);
278
-
279
- /**
280
- * @brief Set global upload limit
281
- */
282
- void set_upload_limit(uint64_t bytes_per_sec);
283
-
284
- /**
285
- * @brief Get our peer ID
286
- */
287
- const PeerID& peer_id() const { return peer_id_; }
288
-
289
- /**
290
- * @brief Get listen port (actual port when running, configured port otherwise)
291
- */
292
- uint16_t listen_port() const {
293
- if (network_manager_ && network_manager_->is_running()) {
294
- return network_manager_->listen_port();
295
- }
296
- return config_.listen_port;
297
- }
298
-
299
- //=========================================================================
300
- // Callbacks
301
- //=========================================================================
302
-
303
- void set_torrent_added_callback(TorrentAddedCallback cb) {
304
- on_torrent_added_ = std::move(cb);
305
- }
306
-
307
- void set_torrent_removed_callback(TorrentRemovedCallback cb) {
308
- on_torrent_removed_ = std::move(cb);
309
- }
310
-
311
- void set_alert_callback(AlertCallback cb) {
312
- on_alert_ = std::move(cb);
313
- }
314
-
315
- //=========================================================================
316
- // Statistics
317
- //=========================================================================
318
-
319
- /**
320
- * @brief Get total download rate (all torrents)
321
- */
322
- uint64_t total_download_rate() const;
323
-
324
- /**
325
- * @brief Get total upload rate (all torrents)
326
- */
327
- uint64_t total_upload_rate() const;
328
-
329
- /**
330
- * @brief Get total connected peers
331
- */
332
- size_t total_peers() const;
333
-
334
- //=========================================================================
335
- // DHT
336
- //=========================================================================
337
-
338
- /**
339
- * @brief Check if DHT is running
340
- */
341
- bool dht_running() const { return dht_running_; }
342
-
343
- /**
344
- * @brief Set an external DHT client to use instead of creating one
345
- *
346
- * Must be called before start(). The external DHT client's lifecycle
347
- * is managed by the caller - BtClient will not start or stop it.
348
- *
349
- * @param dht External DHT client (must remain valid while BtClient is running)
350
- */
351
- void set_external_dht(DhtClient* dht);
352
-
353
- /**
354
- * @brief Get the DHT client (internal or external)
355
- */
356
- DhtClient* get_dht_client() { return external_dht_ ? external_dht_ : dht_client_.get(); }
357
-
358
- /**
359
- * @brief Add DHT bootstrap node
360
- */
361
- void add_dht_node(const std::string& host, uint16_t port);
362
-
363
- /**
364
- * @brief Get DHT node count
365
- */
366
- size_t dht_node_count() const;
367
-
368
- /**
369
- * @brief Announce torrent to DHT
370
- */
371
- void announce_to_dht(const BtInfoHash& info_hash);
372
-
373
- /**
374
- * @brief Find peers for torrent via DHT
375
- */
376
- void find_peers_dht(const BtInfoHash& info_hash);
377
-
378
- //=========================================================================
379
- // Network
380
- //=========================================================================
381
-
382
- /**
383
- * @brief Get the network manager
384
- */
385
- BtNetworkManager* network_manager() { return network_manager_.get(); }
386
-
387
- private:
388
- //=========================================================================
389
- // Internal Methods
390
- //=========================================================================
391
-
392
- void tick_loop();
393
- Torrent::Ptr create_torrent(const TorrentInfo& info, const std::string& save_path);
394
- void on_dht_peers_found(const std::vector<Peer>& peers, const InfoHash& info_hash);
395
- void on_peer_connected(const BtInfoHash& info_hash,
396
- std::shared_ptr<BtPeerConnection> connection,
397
- socket_t socket, bool is_incoming);
398
- void on_peer_disconnected(const BtInfoHash& info_hash, BtPeerConnection* connection);
399
- void on_peer_data(const BtInfoHash& info_hash, BtPeerConnection* connection, socket_t socket);
400
- void connect_pending_peers();
401
- void announce_torrents_to_trackers();
402
-
403
- //=========================================================================
404
- // Data Members
405
- //=========================================================================
406
-
407
- mutable std::mutex mutex_;
408
-
409
- BtClientConfig config_;
410
- PeerID peer_id_;
411
-
412
- std::atomic<bool> running_;
413
- std::atomic<bool> dht_running_;
414
-
415
- std::unordered_map<BtInfoHash, Torrent::Ptr, InfoHashHash> torrents_;
416
-
417
- std::thread tick_thread_;
418
-
419
- // DHT client (owned, if not using external)
420
- std::unique_ptr<DhtClient> dht_client_;
421
-
422
- // External DHT client (non-owning pointer, lifecycle managed externally)
423
- DhtClient* external_dht_ = nullptr;
424
-
425
- // Network manager
426
- std::unique_ptr<BtNetworkManager> network_manager_;
427
-
428
- // Tracker managers per torrent
429
- std::unordered_map<BtInfoHash, std::unique_ptr<TrackerManager>, InfoHashHash> tracker_managers_;
430
-
431
- // Announce timing
432
- std::chrono::steady_clock::time_point last_dht_announce_;
433
- std::chrono::steady_clock::time_point last_tracker_announce_;
434
-
435
- // Deferred removal queue (thread-safe, processed in tick_loop)
436
- mutable std::mutex removal_mutex_;
437
- std::vector<BtInfoHash> pending_removals_;
438
-
439
- // Callbacks
440
- TorrentAddedCallback on_torrent_added_;
441
- TorrentRemovedCallback on_torrent_removed_;
442
- AlertCallback on_alert_;
443
- };
444
-
445
- } // namespace librats