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,418 +0,0 @@
1
- #pragma once
2
-
3
- /**
4
- * @file bt_torrent_info.h
5
- * @brief Torrent metadata parsing and management
6
- *
7
- * Handles parsing of .torrent files and magnet URIs,
8
- * computing info hashes, and managing torrent metadata.
9
- */
10
-
11
- #include "bt_types.h"
12
- #include "bt_file_storage.h"
13
- #include "bencode.h"
14
-
15
- #include <string>
16
- #include <vector>
17
- #include <optional>
18
- #include <memory>
19
-
20
- namespace librats {
21
-
22
- /**
23
- * @brief Tracker tier (for multi-tracker torrents)
24
- */
25
- using TrackerTier = std::vector<std::string>;
26
-
27
- /**
28
- * @brief Error information for parsing failures
29
- */
30
- struct TorrentParseError {
31
- std::string message;
32
-
33
- TorrentParseError() = default;
34
- explicit TorrentParseError(const std::string& msg) : message(msg) {}
35
- };
36
-
37
- /**
38
- * @brief Complete torrent metadata
39
- *
40
- * This class holds all metadata about a torrent, parsed from a .torrent file
41
- * or received via the ut_metadata extension (BEP 9).
42
- *
43
- * Key data includes:
44
- * - Info hash (SHA-1 of the bencoded info dictionary)
45
- * - File structure (single file or directory with multiple files)
46
- * - Piece hashes (SHA-1 hashes for each piece)
47
- * - Tracker URLs
48
- * - Optional metadata (comment, creation date, created by, etc.)
49
- *
50
- * Thread-safe for read operations after construction.
51
- */
52
- class TorrentInfo {
53
- public:
54
- /**
55
- * @brief Default constructor - creates empty/invalid torrent info
56
- */
57
- TorrentInfo();
58
-
59
- /**
60
- * @brief Copy constructor
61
- */
62
- TorrentInfo(const TorrentInfo& other);
63
-
64
- /**
65
- * @brief Move constructor
66
- */
67
- TorrentInfo(TorrentInfo&& other) noexcept;
68
-
69
- /**
70
- * @brief Copy assignment
71
- */
72
- TorrentInfo& operator=(const TorrentInfo& other);
73
-
74
- /**
75
- * @brief Move assignment
76
- */
77
- TorrentInfo& operator=(TorrentInfo&& other) noexcept;
78
-
79
- /**
80
- * @brief Destructor
81
- */
82
- ~TorrentInfo();
83
-
84
- /**
85
- * @brief Load torrent metadata from raw bytes (rats-search compatibility)
86
- *
87
- * @param data Bencoded .torrent file data
88
- * @return true if parsed successfully
89
- */
90
- bool load_from_data(const std::vector<uint8_t>& data);
91
-
92
- /**
93
- * @brief Load torrent metadata from raw bytes (Qt/C style)
94
- *
95
- * @param data Pointer to data
96
- * @param size Size of data
97
- * @return true if parsed successfully
98
- */
99
- bool load_from_data(const uint8_t* data, size_t size);
100
-
101
- //=========================================================================
102
- // Static Factory Methods
103
- //=========================================================================
104
-
105
- /**
106
- * @brief Parse a .torrent file from bytes
107
- *
108
- * @param data Bencoded .torrent file data
109
- * @param error Optional output for error information
110
- * @return Parsed TorrentInfo, or empty if parsing failed
111
- */
112
- static std::optional<TorrentInfo> from_bytes(
113
- const std::vector<uint8_t>& data,
114
- TorrentParseError* error = nullptr);
115
-
116
- /**
117
- * @brief Parse a .torrent file from a file path
118
- *
119
- * @param path Path to the .torrent file
120
- * @param error Optional output for error information
121
- * @return Parsed TorrentInfo, or empty if parsing failed
122
- */
123
- static std::optional<TorrentInfo> from_file(
124
- const std::string& path,
125
- TorrentParseError* error = nullptr);
126
-
127
- /**
128
- * @brief Create TorrentInfo from a magnet URI
129
- *
130
- * Note: This creates a partial TorrentInfo with only the info hash.
131
- * Full metadata must be obtained via DHT or ut_metadata extension.
132
- *
133
- * @param magnet_uri Magnet URI string
134
- * @param error Optional output for error information
135
- * @return Parsed TorrentInfo, or empty if parsing failed
136
- */
137
- static std::optional<TorrentInfo> from_magnet(
138
- const std::string& magnet_uri,
139
- TorrentParseError* error = nullptr);
140
-
141
- /**
142
- * @brief Create TorrentInfo from raw info dictionary bytes
143
- *
144
- * Used when receiving metadata via ut_metadata extension.
145
- *
146
- * @param info_dict_bytes Raw bencoded info dictionary
147
- * @param expected_hash Expected info hash (for verification)
148
- * @param error Optional output for error information
149
- * @return Parsed TorrentInfo, or empty if parsing failed
150
- */
151
- static std::optional<TorrentInfo> from_info_dict(
152
- const std::vector<uint8_t>& info_dict_bytes,
153
- const BtInfoHash& expected_hash,
154
- TorrentParseError* error = nullptr);
155
-
156
- //=========================================================================
157
- // Core Properties
158
- //=========================================================================
159
-
160
- /**
161
- * @brief Check if this torrent info is valid
162
- *
163
- * A TorrentInfo is valid if it has at least an info hash.
164
- * It may not have full metadata (e.g., from magnet link).
165
- */
166
- bool is_valid() const { return !is_zero_hash(info_hash_); }
167
-
168
- /**
169
- * @brief Check if full metadata is available
170
- *
171
- * Returns false for magnet links until metadata is received.
172
- */
173
- bool has_metadata() const { return has_metadata_; }
174
-
175
- /**
176
- * @brief Get the 20-byte info hash
177
- */
178
- const BtInfoHash& info_hash() const { return info_hash_; }
179
-
180
- /**
181
- * @brief Get info hash as hex string
182
- */
183
- std::string info_hash_hex() const { return info_hash_to_hex(info_hash_); }
184
-
185
- /**
186
- * @brief Get the torrent name
187
- */
188
- const std::string& name() const { return name_; }
189
-
190
- /**
191
- * @brief Get the comment (if present)
192
- */
193
- const std::string& comment() const { return comment_; }
194
-
195
- /**
196
- * @brief Get the "created by" string (if present)
197
- */
198
- const std::string& created_by() const { return created_by_; }
199
-
200
- /**
201
- * @brief Get creation date as Unix timestamp (0 if not present)
202
- */
203
- int64_t creation_date() const { return creation_date_; }
204
-
205
- /**
206
- * @brief Check if this is a private torrent
207
- */
208
- bool is_private() const { return is_private_; }
209
-
210
- //=========================================================================
211
- // File and Piece Information
212
- //=========================================================================
213
-
214
- /**
215
- * @brief Get the file storage (file layout)
216
- */
217
- const FileStorage& files() const { return files_; }
218
-
219
- /**
220
- * @brief Get total size of all files in bytes
221
- */
222
- int64_t total_size() const { return files_.total_size(); }
223
-
224
- /**
225
- * @brief Get number of files
226
- */
227
- size_t num_files() const { return files_.num_files(); }
228
-
229
- /**
230
- * @brief Get piece length
231
- */
232
- uint32_t piece_length() const { return files_.piece_length(); }
233
-
234
- /**
235
- * @brief Get number of pieces
236
- */
237
- uint32_t num_pieces() const { return files_.num_pieces(); }
238
-
239
- /**
240
- * @brief Get size of a specific piece
241
- */
242
- uint32_t piece_size(uint32_t index) const { return files_.piece_size(index); }
243
-
244
- /**
245
- * @brief Get the SHA-1 hash for a piece
246
- * @param index Piece index
247
- * @return 20-byte hash, or empty array if index invalid
248
- */
249
- std::array<uint8_t, 20> piece_hash(uint32_t index) const;
250
-
251
- /**
252
- * @brief Get all piece hashes (concatenated 20-byte hashes)
253
- */
254
- const std::vector<uint8_t>& piece_hashes() const { return piece_hashes_; }
255
-
256
- //=========================================================================
257
- // Trackers
258
- //=========================================================================
259
-
260
- /**
261
- * @brief Get the primary tracker URL (announce)
262
- */
263
- const std::string& announce() const { return announce_; }
264
-
265
- /**
266
- * @brief Get all tracker tiers (announce-list)
267
- */
268
- const std::vector<TrackerTier>& announce_list() const { return announce_list_; }
269
-
270
- /**
271
- * @brief Get a flat list of all tracker URLs
272
- */
273
- std::vector<std::string> all_trackers() const;
274
-
275
- //=========================================================================
276
- // Web Seeds
277
- //=========================================================================
278
-
279
- /**
280
- * @brief Get web seed URLs (url-list)
281
- */
282
- const std::vector<std::string>& web_seeds() const { return web_seeds_; }
283
-
284
- //=========================================================================
285
- // DHT Nodes
286
- //=========================================================================
287
-
288
- /**
289
- * @brief DHT node entry (host, port)
290
- */
291
- struct DhtNode {
292
- std::string host;
293
- uint16_t port;
294
- };
295
-
296
- /**
297
- * @brief Get DHT nodes embedded in torrent
298
- */
299
- const std::vector<DhtNode>& dht_nodes() const { return dht_nodes_; }
300
-
301
- //=========================================================================
302
- // Raw Data Access
303
- //=========================================================================
304
-
305
- /**
306
- * @brief Get the raw info dictionary bytes
307
- *
308
- * This is the exact bytes that hash to the info_hash.
309
- * Used for ut_metadata exchange.
310
- */
311
- const std::vector<uint8_t>& info_dict_bytes() const { return info_dict_bytes_; }
312
-
313
- /**
314
- * @brief Get size of info dictionary in bytes
315
- */
316
- size_t metadata_size() const { return info_dict_bytes_.size(); }
317
-
318
- //=========================================================================
319
- // Magnet URI
320
- //=========================================================================
321
-
322
- /**
323
- * @brief Generate a magnet URI for this torrent
324
- * @param include_trackers Include tracker URLs in magnet
325
- * @return Magnet URI string
326
- */
327
- std::string to_magnet_uri(bool include_trackers = true) const;
328
-
329
- //=========================================================================
330
- // Metadata Update (for magnet links)
331
- //=========================================================================
332
-
333
- /**
334
- * @brief Set metadata received from ut_metadata
335
- *
336
- * Used to complete a TorrentInfo that was created from a magnet link.
337
- *
338
- * @param info_dict_bytes Raw info dictionary
339
- * @return true if metadata is valid and matches info hash
340
- */
341
- bool set_metadata(const std::vector<uint8_t>& info_dict_bytes);
342
-
343
- private:
344
- // Core data
345
- BtInfoHash info_hash_;
346
- std::string name_;
347
- std::string comment_;
348
- std::string created_by_;
349
- int64_t creation_date_;
350
- bool is_private_;
351
- bool has_metadata_;
352
-
353
- // File layout
354
- FileStorage files_;
355
-
356
- // Piece hashes (concatenated 20-byte SHA-1 hashes)
357
- std::vector<uint8_t> piece_hashes_;
358
-
359
- // Trackers
360
- std::string announce_;
361
- std::vector<TrackerTier> announce_list_;
362
-
363
- // Web seeds
364
- std::vector<std::string> web_seeds_;
365
-
366
- // DHT nodes
367
- std::vector<DhtNode> dht_nodes_;
368
-
369
- // Raw info dict for ut_metadata
370
- std::vector<uint8_t> info_dict_bytes_;
371
-
372
- //=========================================================================
373
- // Private Helpers
374
- //=========================================================================
375
-
376
- /**
377
- * @brief Parse the info dictionary
378
- */
379
- bool parse_info_dict(const BencodeValue& info_dict, TorrentParseError* error);
380
-
381
- /**
382
- * @brief Calculate info hash from raw bytes
383
- */
384
- static BtInfoHash calculate_info_hash(const std::vector<uint8_t>& info_bytes);
385
-
386
- /**
387
- * @brief URL encode a string for magnet URI
388
- */
389
- static std::string url_encode(const std::string& str);
390
- };
391
-
392
- //=============================================================================
393
- // Magnet URI Parsing Helpers
394
- //=============================================================================
395
-
396
- /**
397
- * @brief Parse a magnet URI and extract components
398
- */
399
- struct MagnetUri {
400
- BtInfoHash info_hash;
401
- std::string display_name;
402
- std::vector<std::string> trackers;
403
- std::vector<std::string> web_seeds;
404
-
405
- /**
406
- * @brief Parse a magnet URI string
407
- * @param uri The magnet URI
408
- * @return Parsed components, or nullopt on failure
409
- */
410
- static std::optional<MagnetUri> parse(const std::string& uri);
411
-
412
- /**
413
- * @brief Check if info hash is valid
414
- */
415
- bool is_valid() const { return !is_zero_hash(info_hash); }
416
- };
417
-
418
- } // namespace librats