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,473 +0,0 @@
1
- #pragma once
2
-
3
- /**
4
- * @file bt_create_torrent.h
5
- * @brief Torrent file creation and generation
6
- *
7
- * Provides functionality to create .torrent files from files or directories.
8
- * Supports both single-file and multi-file torrents.
9
- */
10
-
11
- #include "bt_types.h"
12
- #include "bt_file_storage.h"
13
- #include "bt_torrent_info.h"
14
- #include "bencode.h"
15
-
16
- #include <string>
17
- #include <vector>
18
- #include <optional>
19
- #include <functional>
20
- #include <ctime>
21
-
22
- namespace librats {
23
-
24
- /**
25
- * @brief Error information for torrent creation failures
26
- */
27
- struct TorrentCreateError {
28
- std::string message;
29
-
30
- TorrentCreateError() = default;
31
- explicit TorrentCreateError(const std::string& msg) : message(msg) {}
32
- };
33
-
34
- /**
35
- * @brief Configuration for torrent creation
36
- */
37
- struct TorrentCreatorConfig {
38
- uint32_t piece_size = 0; ///< Piece size in bytes (0 = auto-detect)
39
- bool is_private = false; ///< Private torrent flag
40
- std::string comment; ///< Optional comment
41
- std::string created_by; ///< Optional creator string
42
- std::time_t creation_date = 0; ///< Creation timestamp (0 = current time)
43
- bool include_hidden_files = false; ///< Include hidden files when adding directories
44
-
45
- TorrentCreatorConfig() : creation_date(std::time(nullptr)) {}
46
- };
47
-
48
- /**
49
- * @brief Progress callback for piece hashing
50
- *
51
- * @param current_piece Current piece being hashed (0-indexed)
52
- * @param total_pieces Total number of pieces
53
- */
54
- using PieceHashProgressCallback = std::function<void(uint32_t current_piece, uint32_t total_pieces)>;
55
-
56
- /**
57
- * @brief File filter callback for directory traversal
58
- *
59
- * @param path Full path to the file or directory
60
- * @return true to include the file/traverse the directory, false to skip
61
- */
62
- using FileFilterCallback = std::function<bool(const std::string& path)>;
63
-
64
- /**
65
- * @brief Creates torrent files from files or directories
66
- *
67
- * This class provides a simple API to create .torrent files:
68
- *
69
- * 1. Create TorrentCreator with base path
70
- * 2. Add files or let it scan directories
71
- * 3. Set properties (trackers, comment, etc.)
72
- * 4. Call set_piece_hashes() to compute hashes
73
- * 5. Call generate() to get the bencoded torrent data
74
- *
75
- * Example usage:
76
- * @code
77
- * TorrentCreator creator("./my_folder");
78
- * creator.add_tracker("http://tracker.example.com/announce");
79
- * creator.set_comment("My torrent");
80
- *
81
- * // Hash pieces (this reads all file content)
82
- * creator.set_piece_hashes([](uint32_t current, uint32_t total) {
83
- * std::cout << "Hashing piece " << current << "/" << total << std::endl;
84
- * });
85
- *
86
- * // Generate torrent data
87
- * auto torrent_data = creator.generate();
88
- * @endcode
89
- *
90
- * Thread-safety: Not thread-safe during construction/modification.
91
- * After generate() is called, the resulting data can be used from any thread.
92
- */
93
- class TorrentCreator {
94
- public:
95
- /**
96
- * @brief Create a torrent creator for a file or directory
97
- *
98
- * If path points to a directory, all files in it will be included.
99
- * If path points to a file, a single-file torrent will be created.
100
- *
101
- * @param path Path to file or directory
102
- * @param config Optional configuration
103
- */
104
- explicit TorrentCreator(const std::string& path,
105
- const TorrentCreatorConfig& config = TorrentCreatorConfig());
106
-
107
- /**
108
- * @brief Create a torrent creator with custom file storage
109
- *
110
- * Use this when you want manual control over which files are included.
111
- *
112
- * @param storage Pre-configured file storage
113
- * @param base_path Base path where files are located
114
- * @param config Optional configuration
115
- */
116
- TorrentCreator(FileStorage&& storage,
117
- const std::string& base_path,
118
- const TorrentCreatorConfig& config = TorrentCreatorConfig());
119
-
120
- ~TorrentCreator() = default;
121
-
122
- // Non-copyable, moveable
123
- TorrentCreator(const TorrentCreator&) = delete;
124
- TorrentCreator& operator=(const TorrentCreator&) = delete;
125
- TorrentCreator(TorrentCreator&&) noexcept = default;
126
- TorrentCreator& operator=(TorrentCreator&&) noexcept = default;
127
-
128
- //=========================================================================
129
- // File Management
130
- //=========================================================================
131
-
132
- /**
133
- * @brief Scan path and add all files
134
- *
135
- * If the creator was constructed with a directory path, this is called
136
- * automatically. Call this to re-scan or to scan with a custom filter.
137
- *
138
- * @param filter Optional filter callback
139
- * @return Number of files added
140
- */
141
- size_t scan_files(FileFilterCallback filter = nullptr);
142
-
143
- /**
144
- * @brief Add a single file manually
145
- *
146
- * @param relative_path Path relative to the base path
147
- * @param size File size in bytes
148
- * @return true if added successfully
149
- */
150
- bool add_file(const std::string& relative_path, int64_t size);
151
-
152
- /**
153
- * @brief Get the file storage
154
- */
155
- const FileStorage& files() const { return files_; }
156
-
157
- /**
158
- * @brief Get number of files
159
- */
160
- size_t num_files() const { return files_.num_files(); }
161
-
162
- /**
163
- * @brief Get total size of all files
164
- */
165
- int64_t total_size() const { return files_.total_size(); }
166
-
167
- //=========================================================================
168
- // Torrent Properties
169
- //=========================================================================
170
-
171
- /**
172
- * @brief Set the torrent name
173
- *
174
- * By default, the name is derived from the path.
175
- *
176
- * @param name Torrent name
177
- */
178
- void set_name(const std::string& name);
179
-
180
- /**
181
- * @brief Get the torrent name
182
- */
183
- const std::string& name() const { return files_.name(); }
184
-
185
- /**
186
- * @brief Set the comment
187
- */
188
- void set_comment(const std::string& comment) { comment_ = comment; }
189
-
190
- /**
191
- * @brief Get the comment
192
- */
193
- const std::string& comment() const { return comment_; }
194
-
195
- /**
196
- * @brief Set the creator string
197
- */
198
- void set_creator(const std::string& creator) { created_by_ = creator; }
199
-
200
- /**
201
- * @brief Get the creator string
202
- */
203
- const std::string& creator() const { return created_by_; }
204
-
205
- /**
206
- * @brief Set the creation date
207
- * @param timestamp Unix timestamp (0 to omit from torrent)
208
- */
209
- void set_creation_date(std::time_t timestamp) { creation_date_ = timestamp; }
210
-
211
- /**
212
- * @brief Get the creation date
213
- */
214
- std::time_t creation_date() const { return creation_date_; }
215
-
216
- /**
217
- * @brief Set private flag
218
- */
219
- void set_private(bool is_private) { is_private_ = is_private; }
220
-
221
- /**
222
- * @brief Check if private flag is set
223
- */
224
- bool is_private() const { return is_private_; }
225
-
226
- /**
227
- * @brief Set piece size manually
228
- *
229
- * If not set (or 0), an appropriate piece size will be chosen automatically
230
- * based on the total file size.
231
- *
232
- * @param size Piece size in bytes (must be power of 2, >= 16 KiB)
233
- */
234
- void set_piece_size(uint32_t size);
235
-
236
- /**
237
- * @brief Get piece size
238
- */
239
- uint32_t piece_size() const { return piece_size_; }
240
-
241
- /**
242
- * @brief Get number of pieces
243
- */
244
- uint32_t num_pieces() const { return files_.num_pieces(); }
245
-
246
- //=========================================================================
247
- // Trackers
248
- //=========================================================================
249
-
250
- /**
251
- * @brief Add a tracker URL
252
- *
253
- * @param url Tracker URL (http:// or udp://)
254
- * @param tier Tracker tier (0 = primary, higher = fallback)
255
- */
256
- void add_tracker(const std::string& url, int tier = 0);
257
-
258
- /**
259
- * @brief Get all tracker URLs
260
- */
261
- std::vector<std::string> trackers() const;
262
-
263
- /**
264
- * @brief Clear all trackers
265
- */
266
- void clear_trackers() { trackers_.clear(); }
267
-
268
- //=========================================================================
269
- // Web Seeds
270
- //=========================================================================
271
-
272
- /**
273
- * @brief Add a web seed URL
274
- */
275
- void add_url_seed(const std::string& url);
276
-
277
- /**
278
- * @brief Add an HTTP seed URL
279
- */
280
- void add_http_seed(const std::string& url);
281
-
282
- /**
283
- * @brief Get URL seeds
284
- */
285
- const std::vector<std::string>& url_seeds() const { return url_seeds_; }
286
-
287
- /**
288
- * @brief Get HTTP seeds
289
- */
290
- const std::vector<std::string>& http_seeds() const { return http_seeds_; }
291
-
292
- //=========================================================================
293
- // DHT Nodes
294
- //=========================================================================
295
-
296
- /**
297
- * @brief Add a DHT bootstrap node
298
- */
299
- void add_dht_node(const std::string& host, uint16_t port);
300
-
301
- //=========================================================================
302
- // Piece Hashing
303
- //=========================================================================
304
-
305
- /**
306
- * @brief Compute piece hashes by reading all files
307
- *
308
- * This is a potentially long operation as it reads all file content.
309
- * Call this before generate().
310
- *
311
- * @param progress_callback Optional callback for progress updates
312
- * @param error Optional output for error information
313
- * @return true if all pieces were hashed successfully
314
- */
315
- bool set_piece_hashes(PieceHashProgressCallback progress_callback = nullptr,
316
- TorrentCreateError* error = nullptr);
317
-
318
- /**
319
- * @brief Check if piece hashes have been computed
320
- */
321
- bool has_piece_hashes() const { return !piece_hashes_.empty(); }
322
-
323
- //=========================================================================
324
- // Generation
325
- //=========================================================================
326
-
327
- /**
328
- * @brief Generate the bencoded torrent data
329
- *
330
- * Requires set_piece_hashes() to have been called first.
331
- *
332
- * @param error Optional output for error information
333
- * @return Bencoded torrent data, or empty vector on failure
334
- */
335
- std::vector<uint8_t> generate(TorrentCreateError* error = nullptr) const;
336
-
337
- /**
338
- * @brief Generate and save to a file
339
- *
340
- * @param output_path Path to save the .torrent file
341
- * @param error Optional output for error information
342
- * @return true if saved successfully
343
- */
344
- bool save_to_file(const std::string& output_path,
345
- TorrentCreateError* error = nullptr) const;
346
-
347
- /**
348
- * @brief Generate and return a TorrentInfo object
349
- *
350
- * @param error Optional output for error information
351
- * @return TorrentInfo object, or empty if generation failed
352
- */
353
- std::optional<TorrentInfo> generate_torrent_info(TorrentCreateError* error = nullptr) const;
354
-
355
- /**
356
- * @brief Get the info hash without generating full torrent
357
- *
358
- * Requires set_piece_hashes() to have been called.
359
- *
360
- * @return Info hash, or zero hash if not ready
361
- */
362
- BtInfoHash info_hash() const;
363
-
364
- /**
365
- * @brief Get the info hash as hex string
366
- */
367
- std::string info_hash_hex() const;
368
-
369
- private:
370
- std::string base_path_;
371
- FileStorage files_;
372
-
373
- // Torrent metadata
374
- std::string comment_;
375
- std::string created_by_;
376
- std::time_t creation_date_;
377
- bool is_private_;
378
- uint32_t piece_size_;
379
-
380
- // Trackers (url, tier)
381
- std::vector<std::pair<std::string, int>> trackers_;
382
-
383
- // Seeds
384
- std::vector<std::string> url_seeds_;
385
- std::vector<std::string> http_seeds_;
386
-
387
- // DHT nodes (host, port)
388
- std::vector<std::pair<std::string, uint16_t>> dht_nodes_;
389
-
390
- // Piece hashes (concatenated 20-byte SHA-1 hashes)
391
- std::vector<uint8_t> piece_hashes_;
392
-
393
- // Cached info hash
394
- mutable BtInfoHash cached_info_hash_;
395
- mutable bool info_hash_valid_;
396
-
397
- /**
398
- * @brief Auto-detect optimal piece size
399
- */
400
- uint32_t auto_detect_piece_size() const;
401
-
402
- /**
403
- * @brief Scan directory recursively
404
- */
405
- void scan_directory(const std::string& dir_path,
406
- const std::string& relative_prefix,
407
- FileFilterCallback filter);
408
-
409
- /**
410
- * @brief Build the info dictionary
411
- */
412
- BencodeValue build_info_dict() const;
413
-
414
- /**
415
- * @brief Build the complete torrent dictionary
416
- */
417
- BencodeValue build_torrent_dict() const;
418
- };
419
-
420
- //=============================================================================
421
- // Convenience Functions
422
- //=============================================================================
423
-
424
- /**
425
- * @brief Add files from a path to FileStorage
426
- *
427
- * Recursively adds all files from a directory, or adds a single file.
428
- *
429
- * @param storage FileStorage to add files to
430
- * @param path Path to file or directory
431
- * @param filter Optional filter callback
432
- * @return Number of files added
433
- */
434
- size_t add_files(FileStorage& storage, const std::string& path,
435
- FileFilterCallback filter = nullptr);
436
-
437
- /**
438
- * @brief Create a torrent from a file or directory
439
- *
440
- * Convenience function that creates a torrent in one call.
441
- *
442
- * @param path Path to file or directory
443
- * @param output_path Path to save the .torrent file
444
- * @param trackers Optional list of tracker URLs
445
- * @param comment Optional comment
446
- * @param progress_callback Optional progress callback
447
- * @param error Optional output for error information
448
- * @return true if torrent was created successfully
449
- */
450
- bool create_torrent(const std::string& path,
451
- const std::string& output_path,
452
- const std::vector<std::string>& trackers = {},
453
- const std::string& comment = "",
454
- PieceHashProgressCallback progress_callback = nullptr,
455
- TorrentCreateError* error = nullptr);
456
-
457
- /**
458
- * @brief Create a torrent and return the data
459
- *
460
- * @param path Path to file or directory
461
- * @param trackers Optional list of tracker URLs
462
- * @param comment Optional comment
463
- * @param progress_callback Optional progress callback
464
- * @param error Optional output for error information
465
- * @return Bencoded torrent data, or empty vector on failure
466
- */
467
- std::vector<uint8_t> create_torrent_data(const std::string& path,
468
- const std::vector<std::string>& trackers = {},
469
- const std::string& comment = "",
470
- PieceHashProgressCallback progress_callback = nullptr,
471
- TorrentCreateError* error = nullptr);
472
-
473
- } // namespace librats