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