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,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