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