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,319 +0,0 @@
1
- #pragma once
2
-
3
- #include "bittorrent.h"
4
- #include "socket.h"
5
- #include <string>
6
- #include <vector>
7
- #include <memory>
8
- #include <functional>
9
- #include <chrono>
10
- #include <atomic>
11
- #include <mutex>
12
-
13
- namespace librats {
14
-
15
- // Forward declarations
16
- class TrackerClient;
17
- class HttpTrackerClient;
18
- class UdpTrackerClient;
19
-
20
- // Tracker announce event types (BEP 3)
21
- enum class TrackerEvent {
22
- NONE = 0,
23
- COMPLETED = 1,
24
- STARTED = 2,
25
- STOPPED = 3
26
- };
27
-
28
- // Tracker response structure
29
- struct TrackerResponse {
30
- std::string failure_reason;
31
- std::string warning_message;
32
- uint32_t interval; // Seconds until next announce
33
- uint32_t min_interval; // Minimum announce interval
34
- std::string tracker_id; // Tracker ID for subsequent requests
35
- uint32_t complete; // Number of seeders
36
- uint32_t incomplete; // Number of leechers
37
- uint32_t downloaded; // Number of times downloaded (scrape only)
38
- std::vector<Peer> peers; // Peer list
39
- bool success;
40
-
41
- TrackerResponse()
42
- : interval(1800), min_interval(900), complete(0), incomplete(0),
43
- downloaded(0), success(false) {}
44
- };
45
-
46
- // Tracker announce request parameters
47
- struct TrackerRequest {
48
- InfoHash info_hash;
49
- PeerID peer_id;
50
- uint16_t port;
51
- uint64_t uploaded;
52
- uint64_t downloaded;
53
- uint64_t left;
54
- TrackerEvent event;
55
- std::string ip; // Optional IP address
56
- uint32_t numwant; // Number of peers wanted (default 50)
57
- std::string tracker_id; // Tracker ID from previous response
58
-
59
- TrackerRequest()
60
- : port(0), uploaded(0), downloaded(0), left(0),
61
- event(TrackerEvent::NONE), numwant(50) {}
62
- };
63
-
64
- // Callback for tracker responses
65
- using TrackerResponseCallback = std::function<void(const TrackerResponse& response, const std::string& tracker_url)>;
66
-
67
- // Base tracker client interface
68
- class TrackerClient {
69
- public:
70
- virtual ~TrackerClient() = default;
71
-
72
- // Announce to tracker
73
- virtual bool announce(const TrackerRequest& request, TrackerResponseCallback callback) = 0;
74
-
75
- // Scrape tracker (optional, not all trackers support this)
76
- virtual bool scrape(const std::vector<InfoHash>& info_hashes, TrackerResponseCallback callback) = 0;
77
-
78
- // Get tracker URL
79
- virtual std::string get_url() const = 0;
80
-
81
- // Get last announce time
82
- virtual std::chrono::steady_clock::time_point get_last_announce_time() const = 0;
83
-
84
- // Get announce interval
85
- virtual uint32_t get_interval() const = 0;
86
-
87
- // Check if tracker is working
88
- virtual bool is_working() const = 0;
89
- };
90
-
91
- // HTTP/HTTPS Tracker Client (BEP 3)
92
- class HttpTrackerClient : public TrackerClient {
93
- public:
94
- explicit HttpTrackerClient(const std::string& tracker_url);
95
- ~HttpTrackerClient() override;
96
-
97
- bool announce(const TrackerRequest& request, TrackerResponseCallback callback) override;
98
- bool scrape(const std::vector<InfoHash>& info_hashes, TrackerResponseCallback callback) override;
99
-
100
- std::string get_url() const override { return tracker_url_; }
101
- std::chrono::steady_clock::time_point get_last_announce_time() const override { return last_announce_time_; }
102
- uint32_t get_interval() const override { return interval_; }
103
- bool is_working() const override { return is_working_; }
104
-
105
- private:
106
- std::string tracker_url_;
107
- std::chrono::steady_clock::time_point last_announce_time_;
108
- uint32_t interval_;
109
- std::atomic<bool> is_working_;
110
- std::string tracker_id_;
111
-
112
- // Build announce URL with parameters
113
- std::string build_announce_url(const TrackerRequest& request);
114
-
115
- // Build scrape URL
116
- std::string build_scrape_url(const std::vector<InfoHash>& info_hashes);
117
-
118
- // Parse tracker response (bencode format)
119
- TrackerResponse parse_response(const std::vector<uint8_t>& data);
120
-
121
- // Parse compact peer list (BEP 23)
122
- std::vector<Peer> parse_compact_peers(const std::string& peer_data);
123
-
124
- // Parse dictionary peer list
125
- std::vector<Peer> parse_dict_peers(const BencodeValue& peers_list);
126
-
127
- // HTTP GET request
128
- std::vector<uint8_t> http_get(const std::string& url);
129
-
130
- // URL encode string
131
- std::string url_encode(const std::string& str);
132
-
133
- // URL encode binary data (for info_hash)
134
- std::string url_encode_binary(const uint8_t* data, size_t len);
135
- };
136
-
137
- // UDP Tracker Client (BEP 15)
138
- class UdpTrackerClient : public TrackerClient {
139
- public:
140
- explicit UdpTrackerClient(const std::string& tracker_url);
141
- ~UdpTrackerClient() override;
142
-
143
- bool announce(const TrackerRequest& request, TrackerResponseCallback callback) override;
144
- bool scrape(const std::vector<InfoHash>& info_hashes, TrackerResponseCallback callback) override;
145
-
146
- std::string get_url() const override { return tracker_url_; }
147
- std::chrono::steady_clock::time_point get_last_announce_time() const override { return last_announce_time_; }
148
- uint32_t get_interval() const override { return interval_; }
149
- bool is_working() const override { return is_working_; }
150
-
151
- private:
152
- std::string tracker_url_;
153
- std::string hostname_;
154
- uint16_t port_;
155
- socket_t socket_;
156
- std::chrono::steady_clock::time_point last_announce_time_;
157
- std::chrono::steady_clock::time_point connection_expire_time_;
158
- uint32_t interval_;
159
- std::atomic<bool> is_working_;
160
- int64_t connection_id_;
161
- std::mutex socket_mutex_;
162
-
163
- // UDP tracker protocol constants
164
- static constexpr int64_t PROTOCOL_ID = 0x41727101980LL;
165
- static constexpr uint32_t ACTION_CONNECT = 0;
166
- static constexpr uint32_t ACTION_ANNOUNCE = 1;
167
- static constexpr uint32_t ACTION_SCRAPE = 2;
168
- static constexpr uint32_t ACTION_ERROR = 3;
169
-
170
- // Parse tracker URL
171
- bool parse_url();
172
-
173
- // Connect to UDP tracker (get connection ID)
174
- bool connect();
175
-
176
- // Check if connection is still valid
177
- bool is_connection_valid();
178
-
179
- // Send UDP request and receive response
180
- std::vector<uint8_t> send_request(const std::vector<uint8_t>& request, int timeout_ms = 15000);
181
-
182
- // Build connect request
183
- std::vector<uint8_t> build_connect_request(uint32_t transaction_id);
184
-
185
- // Build announce request
186
- std::vector<uint8_t> build_announce_request(const TrackerRequest& request, uint32_t transaction_id);
187
-
188
- // Build scrape request
189
- std::vector<uint8_t> build_scrape_request(const std::vector<InfoHash>& info_hashes, uint32_t transaction_id);
190
-
191
- // Parse connect response
192
- bool parse_connect_response(const std::vector<uint8_t>& data, uint32_t expected_transaction_id);
193
-
194
- // Parse announce response
195
- TrackerResponse parse_announce_response(const std::vector<uint8_t>& data, uint32_t expected_transaction_id);
196
-
197
- // Parse scrape response
198
- TrackerResponse parse_scrape_response(const std::vector<uint8_t>& data, uint32_t expected_transaction_id);
199
-
200
- // Parse error response
201
- std::string parse_error_response(const std::vector<uint8_t>& data);
202
-
203
- // Generate random transaction ID
204
- uint32_t generate_transaction_id();
205
-
206
- // Read 32-bit big-endian integer
207
- static uint32_t read_uint32_be(const uint8_t* data);
208
-
209
- // Write 32-bit big-endian integer
210
- static void write_uint32_be(uint8_t* data, uint32_t value);
211
-
212
- // Read 64-bit big-endian integer
213
- static int64_t read_int64_be(const uint8_t* data);
214
-
215
- // Write 64-bit big-endian integer
216
- static void write_int64_be(uint8_t* data, int64_t value);
217
- };
218
-
219
- // Tracker Manager - manages multiple trackers for a torrent
220
- class TrackerManager {
221
- public:
222
- explicit TrackerManager(const TorrentInfo& torrent_info);
223
- ~TrackerManager();
224
-
225
- // Add tracker from URL
226
- bool add_tracker(const std::string& tracker_url);
227
-
228
- // Announce to all trackers
229
- void announce(const TrackerRequest& request, TrackerResponseCallback callback);
230
-
231
- // Announce to best tracker only
232
- void announce_to_best(const TrackerRequest& request, TrackerResponseCallback callback);
233
-
234
- // Scrape all trackers
235
- void scrape(TrackerResponseCallback callback);
236
-
237
- // Get number of working trackers
238
- size_t get_working_tracker_count() const;
239
-
240
- // Get all tracker URLs
241
- std::vector<std::string> get_tracker_urls() const;
242
-
243
- // Check if it's time to announce
244
- bool should_announce() const;
245
-
246
- // Get next announce time
247
- std::chrono::steady_clock::time_point get_next_announce_time() const;
248
-
249
- private:
250
- std::vector<std::shared_ptr<TrackerClient>> trackers_;
251
- mutable std::mutex trackers_mutex_;
252
- InfoHash info_hash_;
253
- std::chrono::steady_clock::time_point last_announce_time_;
254
- uint32_t announce_interval_;
255
-
256
- // Create tracker client based on URL scheme
257
- std::shared_ptr<TrackerClient> create_tracker_client(const std::string& tracker_url);
258
-
259
- // Sort trackers by priority (working trackers first)
260
- void sort_trackers_by_priority();
261
- };
262
-
263
- // Utility functions
264
- std::string tracker_event_to_string(TrackerEvent event);
265
- TrackerEvent string_to_tracker_event(const std::string& event_str);
266
-
267
- //=============================================================================
268
- // Simple Scrape API - for getting seeders/leechers without full TorrentInfo
269
- //=============================================================================
270
-
271
- /**
272
- * @brief Simple scrape result structure
273
- */
274
- struct ScrapeResult {
275
- uint32_t seeders = 0; // Number of seeders (complete)
276
- uint32_t leechers = 0; // Number of leechers (incomplete)
277
- uint32_t completed = 0; // Number of times downloaded
278
- std::string tracker; // Tracker URL that responded
279
- bool success = false; // Whether the scrape succeeded
280
- std::string error; // Error message if failed
281
- };
282
-
283
- /**
284
- * @brief Callback for simple scrape operations
285
- */
286
- using ScrapeCallback = std::function<void(const ScrapeResult&)>;
287
-
288
- // Note: hex_to_info_hash is declared in bittorrent.h
289
-
290
- /**
291
- * @brief Scrape a single tracker for torrent statistics
292
- * @param tracker_url Full tracker URL (udp://... or http://...)
293
- * @param info_hash_hex 40-character hex string of info hash
294
- * @param callback Callback with scrape result
295
- * @param timeout_ms Timeout in milliseconds (default: 15000)
296
- */
297
- void scrape_tracker(const std::string& tracker_url,
298
- const std::string& info_hash_hex,
299
- ScrapeCallback callback,
300
- int timeout_ms = 15000);
301
-
302
- /**
303
- * @brief Scrape multiple default trackers and return best result
304
- * @param info_hash_hex 40-character hex string of info hash
305
- * @param callback Callback with best scrape result
306
- * @param timeout_ms Timeout per tracker in milliseconds (default: 10000)
307
- */
308
- void scrape_multiple_trackers(const std::string& info_hash_hex,
309
- ScrapeCallback callback,
310
- int timeout_ms = 10000);
311
-
312
- /**
313
- * @brief Get list of default public trackers
314
- * @return Vector of tracker URLs
315
- */
316
- std::vector<std::string> get_default_trackers();
317
-
318
- } // namespace librats
319
-