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
@@ -84,7 +84,8 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
84
84
  endif()
85
85
 
86
86
  # Options
87
- option(RATS_BUILD_EXAMPLES "Build examples" ON)
87
+ option(RATS_BUILD_CLIENT "Build the rats-client reference application" ON)
88
+ option(RATS_BUILD_EXAMPLES "Build the examples/ programs" OFF)
88
89
  option(RATS_BUILD_TESTS "Build unit tests" ON)
89
90
  option(RATS_ENABLE_ASAN "Enable AddressSanitizer" OFF)
90
91
  option(RATS_ENABLE_TSAN "Enable ThreadSanitizer" OFF)
@@ -112,8 +113,25 @@ endif()
112
113
 
113
114
  # Configure version.h from template
114
115
  configure_file(
115
- ${PROJECT_SOURCE_DIR}/src/version.h.in
116
- ${PROJECT_BINARY_DIR}/src/version.h
116
+ ${PROJECT_SOURCE_DIR}/src/librats/util/version.h.in
117
+ ${PROJECT_BINARY_DIR}/src/librats/util/version.h
118
+ @ONLY
119
+ )
120
+
121
+ # Configure features.h from template — records how this build was configured, so
122
+ # the installed headers describe themselves instead of relying on the consumer's
123
+ # build system to repeat the flags. Must come after the RATS_SEARCH_FEATURES /
124
+ # RATS_STORAGE options and the shared/static resolution above.
125
+ #
126
+ # `#cmakedefine RATS_IMPORT_DLL` reads a variable of that name: a consumer of the
127
+ # shared build needs __declspec(dllimport) on the public classes, a consumer of
128
+ # the static build must NOT have it (it would look for __imp_ symbols that are not
129
+ # there). The library's own sources get RATS_EXPORT_DLL PRIVATE, which
130
+ # rats_export.h tests first, so dllexport still wins while compiling librats.
131
+ set(RATS_IMPORT_DLL ${RATS_SHARED_LIBRARY})
132
+ configure_file(
133
+ ${PROJECT_SOURCE_DIR}/src/librats/util/features.h.in
134
+ ${PROJECT_BINARY_DIR}/src/librats/util/features.h
117
135
  @ONLY
118
136
  )
119
137
 
@@ -126,161 +144,271 @@ if(WIN32)
126
144
  )
127
145
  endif()
128
146
 
129
- # Define library sources
147
+ # Define library sources, grouped by subsystem (mirrors the src/librats/ layout)
130
148
  set(LIBRARY_SOURCES
131
- src/socket.cpp
132
- src/socket.h
133
- src/network_utils.cpp
134
- src/network_utils.h
135
- src/network_monitor.cpp
136
- src/network_monitor.h
137
- src/dht.cpp
138
- src/dht.h
139
- src/bencode.cpp
140
- src/bencode.h
141
- src/krpc.cpp
142
- src/krpc.h
143
- src/librats.cpp
144
- src/librats_discovery.cpp
145
- src/librats_reconnection.cpp
146
- src/librats_logging.cpp
147
- src/librats_encryption.cpp
148
- src/librats_file_transfer.cpp
149
- src/librats_gossipsub.cpp
150
- src/librats_mdns.cpp
151
- src/librats_persistence.cpp
152
- src/librats_statistic.cpp
153
- src/librats.h
154
- src/sha1.cpp
155
- src/sha1.h
156
- src/os.cpp
157
- src/os.h
158
- src/fs.cpp
159
- src/fs.h
160
- src/logger.h
161
- src/logger.cpp
162
- src/mdns.cpp
163
- src/mdns.h
164
- src/threadmanager.cpp
165
- src/threadmanager.h
166
- src/gossipsub.cpp
167
- src/gossipsub.h
168
- src/file_transfer.cpp
169
- src/file_transfer.h
170
- src/version.cpp
171
- src/rats_export.h
172
- ${PROJECT_BINARY_DIR}/src/version.h
173
-
174
- # Buffer utilities for async I/O, file transfer, and bittorrent
175
- src/receive_buffer.h
176
- src/receive_buffer.cpp
177
- src/chained_send_buffer.h
178
- src/chained_send_buffer.cpp
179
-
180
- # Platform-optimal I/O multiplexing (epoll/kqueue/IOCP)
181
- src/io_poller.h
182
- src/io_poller.cpp
183
-
184
- # Crypto algorithms including Noise Protocol
185
- src/crypto/curve25519.c
186
- src/crypto/curve25519.h
187
- src/crypto/chacha.c
188
- src/crypto/chacha.h
189
- src/crypto/poly1305.c
190
- src/crypto/poly1305.h
191
- src/crypto/chachapoly.c
192
- src/crypto/chachapoly.h
193
- src/crypto/sha256.c
194
- src/crypto/sha256.h
195
- src/crypto/sha512.c
196
- src/crypto/sha512.h
197
- src/crypto/hkdf.c
198
- src/crypto/hkdf.h
199
- src/crypto/blake2s.c
200
- src/crypto/blake2s.h
201
- src/crypto/blake2b.c
202
- src/crypto/blake2b.h
203
- src/crypto/blake2_endian.h
204
-
205
- # Noise Protocol implementation
206
- src/noise.cpp
207
- src/noise.h
208
-
209
- # NAT traversal (STUN/TURN/ICE)
210
- src/stun.cpp
211
- src/stun.h
212
- src/turn.cpp
213
- src/turn.h
214
- src/ice.cpp
215
- src/ice.h
216
- src/librats_ice.cpp
217
-
218
- # Automatic port forwarding (UPnP IGD / NAT-PMP)
219
- src/port_mapping.h
220
- src/upnp.cpp
221
- src/upnp.h
222
- src/natpmp.cpp
223
- src/natpmp.h
224
- src/librats_portmap.cpp
149
+ # core/ — sockets, async I/O buffers, platform I/O multiplexing, reactor primitives
150
+ src/librats/core/socket.h
151
+ src/librats/core/socket.cpp
152
+ src/librats/core/receive_buffer.h
153
+ src/librats/core/receive_buffer.cpp
154
+ src/librats/core/chained_send_buffer.h
155
+ src/librats/core/chained_send_buffer.cpp
156
+ src/librats/core/io_poller.h
157
+ src/librats/core/io_poller.cpp
158
+ src/librats/core/bytes.h
159
+ src/librats/core/address.h
160
+ src/librats/core/address.cpp
161
+ src/librats/core/ip_address.h
162
+ src/librats/core/ip_address.cpp
163
+ src/librats/core/host_endpoint.h
164
+ src/librats/core/endpoint_parse.h
165
+ src/librats/core/endpoint_parse.cpp
166
+ src/librats/core/types.h
167
+ src/librats/core/types.cpp
168
+ src/librats/core/mpsc_queue.h
169
+ src/librats/core/timer_queue.h
170
+ src/librats/core/notifier.h
171
+ src/librats/core/event_bus.h
172
+ src/librats/core/service_registry.h
173
+
174
+ # util/ — networking helpers, OS/filesystem, logging, version
175
+ src/librats/util/network_utils.h
176
+ src/librats/util/network_utils.cpp
177
+ src/librats/util/network_monitor.h
178
+ src/librats/util/network_monitor.cpp
179
+ src/librats/util/os.h
180
+ src/librats/util/os.cpp
181
+ src/librats/util/fs.h
182
+ src/librats/util/fs.cpp
183
+ src/librats/util/logger.h
184
+ src/librats/util/logger.cpp
185
+ src/librats/util/json.h
186
+ src/librats/util/json.cpp
187
+ src/librats/util/version.cpp
188
+ src/librats/util/rats_export.h
189
+ ${PROJECT_BINARY_DIR}/src/librats/util/version.h
190
+ ${PROJECT_BINARY_DIR}/src/librats/util/features.h
191
+
192
+ # wire/ length-prefixed frame format + type-routed dispatch
193
+ src/librats/wire/frame.h
194
+ src/librats/wire/frame.cpp
195
+ src/librats/wire/message_router.h
196
+ src/librats/wire/message_router.cpp
197
+
198
+ # transport/ — shared-nothing reactor, per-connection state machine,
199
+ # interchangeable TCP / reliable-UDP links
200
+ src/librats/transport/link.h
201
+ src/librats/transport/tcp_link.h
202
+ src/librats/transport/tcp_link.cpp
203
+ src/librats/transport/udp_packet.h
204
+ src/librats/transport/udp_packet.cpp
205
+ src/librats/transport/udp_stream.h
206
+ src/librats/transport/udp_stream.cpp
207
+ src/librats/transport/udp_mux.h
208
+ src/librats/transport/udp_mux.cpp
209
+ src/librats/transport/connection.h
210
+ src/librats/transport/connection.cpp
211
+ src/librats/transport/reactor.h
212
+ src/librats/transport/reactor.cpp
213
+ src/librats/transport/reactor_pool.h
214
+
215
+ # peer/ — self-certifying peer ids, routing/connection tables
216
+ src/librats/peer/peer_id.h
217
+ src/librats/peer/peer_id.cpp
218
+ src/librats/peer/peer_info.h
219
+ src/librats/peer/peer.h
220
+ src/librats/peer/peer_table.h
221
+ src/librats/peer/peer_table.cpp
222
+ src/librats/peer/peer_book.h
223
+ src/librats/peer/peer_book.cpp
224
+
225
+ # security/ — Noise XX / plaintext over a self-certifying identity
226
+ src/librats/security/session.h
227
+ src/librats/security/identity.h
228
+ src/librats/security/handshaker.h
229
+ src/librats/security/noise_security.h
230
+ src/librats/security/noise_security.cpp
231
+ src/librats/security/plaintext_security.h
232
+
233
+ # node/ — node facade, peer-network contract, identify handshake
234
+ src/librats/node/config.h
235
+ src/librats/node/host_events.h
236
+ src/librats/node/node_context.h
237
+ src/librats/node/peer_network.h
238
+ src/librats/node/node.h
239
+ src/librats/node/node.cpp
240
+ src/librats/node/identify.h
241
+ src/librats/node/identify.cpp
242
+ src/librats/node/dialer.h
243
+ src/librats/node/dialer.cpp
244
+ src/librats/node/dial_service.h
245
+ src/librats/node/nat_status.h
246
+ src/librats/node/nat_status.cpp
247
+
248
+ # subsystems/ — opt-in plugins attached to a Node
249
+ src/librats/subsystems/ping_service.h
250
+ src/librats/subsystems/ping_service.cpp
251
+ src/librats/subsystems/pubsub.h
252
+ src/librats/subsystems/pubsub.cpp
253
+ src/librats/subsystems/message_json.h
254
+ src/librats/subsystems/message_json.cpp
255
+ src/librats/subsystems/file_transfer.h
256
+ src/librats/subsystems/file_transfer.cpp
257
+ src/librats/subsystems/dht_service.h
258
+ src/librats/subsystems/dht_discovery.h
259
+ src/librats/subsystems/dht_discovery.cpp
260
+ src/librats/subsystems/mdns_discovery.h
261
+ src/librats/subsystems/mdns_discovery.cpp
262
+ src/librats/subsystems/reconnection.h
263
+ src/librats/subsystems/reconnection.cpp
264
+ src/librats/subsystems/peer_exchange.h
265
+ src/librats/subsystems/peer_exchange.cpp
266
+ src/librats/subsystems/port_mapping_service.h
267
+ src/librats/subsystems/port_mapping_service.cpp
268
+ src/librats/subsystems/hole_punch.h
269
+ src/librats/subsystems/hole_punch.cpp
270
+ src/librats/subsystems/hole_punch_service.h
271
+
272
+ # dht/ — Kademlia DHT + KRPC (bencode is shared with bittorrent, always built)
273
+ src/librats/dht/dht.h
274
+ src/librats/dht/dht.cpp
275
+ src/librats/dht/krpc.h
276
+ src/librats/dht/krpc.cpp
277
+ # dht/ modular layer (rewrite in progress) — leaf types
278
+ src/librats/dht/id.h
279
+ src/librats/dht/log.h
280
+ src/librats/dht/node_entry.h
281
+ src/librats/dht/bep42.h
282
+ src/librats/dht/bep42.cpp
283
+ src/librats/dht/routing_table.h
284
+ src/librats/dht/routing_table.cpp
285
+ src/librats/dht/transport.h
286
+ src/librats/dht/observer.h
287
+ src/librats/dht/rpc_manager.h
288
+ src/librats/dht/rpc_manager.cpp
289
+ src/librats/dht/traversal.h
290
+ src/librats/dht/traversal.cpp
291
+ src/librats/dht/find_peers.h
292
+ src/librats/dht/find_peers.cpp
293
+ src/librats/dht/announce.h
294
+ src/librats/dht/announce.cpp
295
+ src/librats/dht/storage.h
296
+ src/librats/dht/storage.cpp
297
+ src/librats/dht/dos_blocker.h
298
+ src/librats/dht/dos_blocker.cpp
299
+ src/librats/dht/node.h
300
+ src/librats/dht/node.cpp
301
+ src/librats/dht/udp_transport.h
302
+ src/librats/dht/udp_transport.cpp
303
+ src/librats/dht/dht_runner.h
304
+ src/librats/dht/dht_runner.cpp
305
+ src/librats/dht/persistence.h
306
+ src/librats/dht/persistence.cpp
307
+ src/librats/bittorrent/bencode.h
308
+ src/librats/bittorrent/bencode.cpp
309
+
310
+ # mdns/ — local-network service discovery
311
+ src/librats/mdns/mdns.h
312
+ src/librats/mdns/log.h
313
+ src/librats/mdns/mdns.cpp
314
+
315
+ # crypto/ — hashes, ciphers, KDFs
316
+ src/librats/crypto/sha1.h
317
+ src/librats/crypto/sha1.cpp
318
+ src/librats/crypto/crc32.h
319
+ src/librats/crypto/crc32.cpp
320
+ src/librats/crypto/curve25519.c
321
+ src/librats/crypto/curve25519.h
322
+ src/librats/crypto/chacha.c
323
+ src/librats/crypto/chacha.h
324
+ src/librats/crypto/poly1305.c
325
+ src/librats/crypto/poly1305.h
326
+ src/librats/crypto/chachapoly.c
327
+ src/librats/crypto/chachapoly.h
328
+ src/librats/crypto/sha256.c
329
+ src/librats/crypto/sha256.h
330
+ src/librats/crypto/sha512.c
331
+ src/librats/crypto/sha512.h
332
+ src/librats/crypto/hkdf.c
333
+ src/librats/crypto/hkdf.h
334
+ src/librats/crypto/blake2s.c
335
+ src/librats/crypto/blake2s.h
336
+ src/librats/crypto/blake2b.c
337
+ src/librats/crypto/blake2b.h
338
+ src/librats/crypto/blake2_endian.h
339
+
340
+ # crypto/ — Noise Protocol framework (Noise_XX transport encryption)
341
+ src/librats/crypto/noise.cpp
342
+ src/librats/crypto/noise.h
343
+
344
+ # nat/ — STUN public-IP discovery + UPnP IGD / NAT-PMP port forwarding
345
+ src/librats/nat/stun.h
346
+ src/librats/nat/stun.cpp
347
+ src/librats/nat/port_mapping.h
348
+ src/librats/nat/upnp.h
349
+ src/librats/nat/upnp.cpp
350
+ src/librats/nat/natpmp.h
351
+ src/librats/nat/natpmp.cpp
225
352
  )
226
353
 
227
354
  # Add BitTorrent sources if RATS_SEARCH_FEATURES is enabled
228
355
  if(RATS_SEARCH_FEATURES)
229
356
  list(APPEND LIBRARY_SOURCES
230
- src/librats_bittorrent.cpp
231
- src/bittorrent.cpp
232
- src/bittorrent.h
233
- src/bt_types.h
234
- src/bt_bitfield.h
235
- src/bt_bitfield.cpp
236
- src/bt_file_storage.h
237
- src/bt_file_storage.cpp
238
- src/bt_torrent_info.h
239
- src/bt_torrent_info.cpp
240
- src/bt_piece_picker.h
241
- src/bt_piece_picker.cpp
242
- src/bt_messages.h
243
- src/bt_messages.cpp
244
- src/bt_handshake.h
245
- src/bt_handshake.cpp
246
- src/bt_peer_connection.h
247
- src/bt_peer_connection.cpp
248
- src/bt_extension.h
249
- src/bt_extension.cpp
250
- src/bt_choker.h
251
- src/bt_choker.cpp
252
- src/bt_torrent.h
253
- src/bt_torrent.cpp
254
- src/bt_client.h
255
- src/bt_client.cpp
256
- src/bt_network.h
257
- src/bt_network.cpp
258
- src/disk_io.cpp
259
- src/disk_io.h
260
- src/tracker.cpp
261
- src/tracker.h
262
- src/bt_create_torrent.h
263
- src/bt_create_torrent.cpp
264
- src/bt_resume_data.h
265
- src/bt_resume_data.cpp
357
+ src/librats/bittorrent/types.h
358
+ src/librats/bittorrent/types.cpp
359
+ src/librats/bittorrent/byte_io.h
360
+ src/librats/bittorrent/bitfield.h
361
+ src/librats/bittorrent/bitfield.cpp
362
+ src/librats/bittorrent/file_storage.h
363
+ src/librats/bittorrent/file_storage.cpp
364
+ src/librats/bittorrent/magnet_uri.h
365
+ src/librats/bittorrent/magnet_uri.cpp
366
+ src/librats/bittorrent/torrent_info.h
367
+ src/librats/bittorrent/torrent_info.cpp
368
+ src/librats/bittorrent/store_buffer.h
369
+ src/librats/bittorrent/store_buffer.cpp
370
+ src/librats/bittorrent/disk_io.h
371
+ src/librats/bittorrent/disk_io.cpp
372
+ src/librats/bittorrent/piece_picker.h
373
+ src/librats/bittorrent/piece_picker.cpp
374
+ src/librats/bittorrent/reactor.h
375
+ src/librats/bittorrent/reactor.cpp
376
+ src/librats/bittorrent/peer_connection.h
377
+ src/librats/bittorrent/peer_connection.cpp
378
+ src/librats/bittorrent/choker.h
379
+ src/librats/bittorrent/choker.cpp
380
+ src/librats/bittorrent/torrent.h
381
+ src/librats/bittorrent/torrent.cpp
382
+ src/librats/bittorrent/client.h
383
+ src/librats/bittorrent/client.cpp
384
+ src/librats/bittorrent/extensions.h
385
+ src/librats/bittorrent/extensions.cpp
386
+ src/librats/bittorrent/peer_list.h
387
+ src/librats/bittorrent/peer_list.cpp
388
+ src/librats/bittorrent/tracker.h
389
+ src/librats/bittorrent/tracker.cpp
390
+ src/librats/bittorrent/resume_data.h
391
+ src/librats/bittorrent/resume_data.cpp
392
+ src/librats/bittorrent/torrent_creator.h
393
+ src/librats/bittorrent/torrent_creator.cpp
394
+ src/librats/subsystems/bittorrent.h
395
+ src/librats/subsystems/bittorrent.cpp
266
396
  )
267
397
  endif()
268
398
 
269
399
  # Add Storage sources if RATS_STORAGE is enabled
400
+ # StorageManager is a Node subsystem (reaches the mesh via PeerNetwork).
270
401
  if(RATS_STORAGE)
271
402
  list(APPEND LIBRARY_SOURCES
272
- src/crc32.cpp
273
- src/crc32.h
274
- src/storage.cpp
275
- src/storage.h
276
- src/librats_storage.cpp
403
+ src/librats/storage/storage.cpp
404
+ src/librats/storage/storage.h
277
405
  )
278
406
  endif()
279
407
 
280
408
  if(RATS_BINDINGS)
281
- list(APPEND LIBRARY_SOURCES
282
- src/librats_c.cpp
283
- src/librats_c.h
409
+ list(APPEND LIBRARY_SOURCES
410
+ src/librats/bindings/rats.h
411
+ src/librats/bindings/rats.cpp
284
412
  )
285
413
  endif()
286
414
 
@@ -291,7 +419,18 @@ if(RATS_SHARED_LIBRARY)
291
419
  VERSION ${VERSION_STRING}
292
420
  SOVERSION ${VERSION_MAJOR}
293
421
  )
294
- target_compile_definitions(rats PRIVATE RATS_EXPORT_DLL)
422
+ # PRIVATE: dllexport while compiling the library itself.
423
+ # INTERFACE: dllimport for anyone linking the shared library. This rides the
424
+ # exported target (install(EXPORT) writes it into ratsTargets.cmake), which
425
+ # covers find_package and vcpkg. It is belt-and-braces: the generated
426
+ # librats/util/features.h defines RATS_IMPORT_DLL too, which is what reaches
427
+ # consumers that never read the CMake target (vcpkg's MSBuild integration, a
428
+ # hand-rolled -I build). Both derive from RATS_SHARED_LIBRARY and the header
429
+ # guards with #ifndef, so they cannot disagree or redefine.
430
+ target_compile_definitions(rats
431
+ PRIVATE RATS_EXPORT_DLL
432
+ INTERFACE RATS_IMPORT_DLL
433
+ )
295
434
  else()
296
435
  add_library(rats STATIC ${LIBRARY_SOURCES})
297
436
  endif()
@@ -306,22 +445,45 @@ include(GNUInstallDirs)
306
445
 
307
446
  # Include directories. INSTALL_INTERFACE entries are only consumed via the
308
447
  # exported target, so they are safe to declare even when RATS_INSTALL is OFF.
448
+ #
449
+ # The include root is the PARENT of the librats/ directory — src/ in the build
450
+ # tree, <prefix>/include once installed — and every header spells its own path in
451
+ # full, "librats/<subdir>/<name>.h", even for a sibling in the same directory.
452
+ # That is what makes an installed header compile from -I<prefix>/include alone
453
+ # and keeps generic names (core/, node/, util/, …) off the consumer's include
454
+ # path. Do not add src/librats or include/librats as a second root: a header that
455
+ # resolved only through it would build in-tree and break for installed consumers.
309
456
  target_include_directories(rats
310
457
  PUBLIC
311
458
  $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src>
312
- $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src/crypto>
313
459
  $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/src>
314
- $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/librats>
315
- $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/librats/crypto>
460
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
316
461
  )
317
462
 
318
463
  # Find and link threading support
319
464
  find_package(Threads REQUIRED)
320
465
  target_link_libraries(rats Threads::Threads)
321
466
 
467
+ # 64-bit atomics: on 32-bit targets (e.g. ppc, armv7, x86, mips) an 8-byte
468
+ # std::atomic is not lock-free in hardware, so the compiler lowers it to
469
+ # __atomic_*_8 libcalls that live in libatomic. Detect that case and link it,
470
+ # otherwise the link fails with "undefined ___atomic_fetch_add_8" etc.
471
+ include(CheckCXXSourceCompiles)
472
+ set(CMAKE_REQUIRED_FLAGS "${CMAKE_CXX_FLAGS}")
473
+ check_cxx_source_compiles("
474
+ #include <atomic>
475
+ #include <cstdint>
476
+ std::atomic<uint64_t> x;
477
+ int main() { x.fetch_add(1); x.store(2); return (int)x.load(); }
478
+ " HAVE_BUILTIN_ATOMIC64)
479
+ unset(CMAKE_REQUIRED_FLAGS)
480
+ if(NOT HAVE_BUILTIN_ATOMIC64)
481
+ target_link_libraries(rats atomic)
482
+ endif()
483
+
322
484
  # Link networking libraries
323
485
  if(WIN32)
324
- target_link_libraries(rats ws2_32 iphlpapi bcrypt)
486
+ target_link_libraries(rats ws2_32 iphlpapi bcrypt advapi32)
325
487
  endif()
326
488
 
327
489
  if(ANDROID)
@@ -354,8 +516,8 @@ if(RATS_STORAGE)
354
516
  target_compile_definitions(rats PUBLIC RATS_STORAGE)
355
517
  endif(RATS_STORAGE)
356
518
 
357
- # Create the main executable
358
- if(RATS_BUILD_EXAMPLES)
519
+ # Create the main executable (the rats-client reference application)
520
+ if(RATS_BUILD_CLIENT)
359
521
  add_executable(rats-client src/main.cpp)
360
522
  target_link_libraries(rats-client rats)
361
523
 
@@ -444,30 +606,36 @@ if(RATS_BUILD_TESTS)
444
606
  # Create test source list
445
607
  set(TEST_SOURCES
446
608
  tests/test_socket.cpp
609
+ tests/test_ip_address.cpp
447
610
  tests/test_bencode.cpp
448
611
  tests/test_sha1.cpp
449
612
  tests/test_network_utils.cpp
450
613
  tests/test_dht.cpp
451
- tests/test_rats_client.cpp
614
+ tests/test_dht_id.cpp
615
+ tests/test_dht_bootstrap.cpp
616
+ tests/test_dht_bep42.cpp
617
+ tests/test_dht_node_entry.cpp
618
+ tests/test_dht_routing_table.cpp
619
+ tests/test_dht_ip_diversity.cpp
620
+ tests/test_dht_rpc_manager.cpp
621
+ tests/test_dht_traversal.cpp
622
+ tests/test_dht_storage.cpp
623
+ tests/test_dht_node.cpp
624
+ tests/test_dht_persistence_v2.cpp
625
+ tests/test_dht_udp.cpp
626
+ tests/test_dht_shutdown.cpp
452
627
  tests/test_os.cpp
453
628
  tests/test_fs.cpp
454
- tests/test_config_persistence.cpp
629
+ tests/test_json.cpp
455
630
  tests/test_main.cpp
456
- tests/test_message_exchange.cpp
457
- tests/test_gossipsub.cpp
458
- tests/test_logging_api_gtest.cpp
459
- tests/test_file_transfer.cpp
460
- tests/test_reconnection.cpp
461
631
  # Noise Protocol Crypto tests
462
632
  tests/test_crypto_curve25519.cpp
463
633
  tests/test_crypto_chacha_poly.cpp
464
634
  tests/test_crypto_sha2.cpp
465
635
  tests/test_crypto_blake2.cpp
466
636
  tests/test_noise.cpp
467
- # NAT traversal tests (STUN/TURN/ICE)
637
+ # NAT traversal tests (STUN)
468
638
  tests/test_stun.cpp
469
- tests/test_turn.cpp
470
- tests/test_ice.cpp
471
639
  # Automatic port forwarding tests (UPnP/NAT-PMP)
472
640
  tests/test_portmap.cpp
473
641
  # Network change detection tests
@@ -477,26 +645,64 @@ if(RATS_BUILD_TESTS)
477
645
  # Buffer utilities for file transfer and bittorrent
478
646
  tests/test_receive_buffer.cpp
479
647
  tests/test_chained_send_buffer.cpp
648
+ # Wire framing, reactor transport, node + subsystems
649
+ tests/test_frame.cpp
650
+ tests/test_reactor.cpp
651
+ tests/test_transport_udp.cpp
652
+ tests/test_dialer.cpp
653
+ tests/test_peer_table.cpp
654
+ tests/test_handshake.cpp
655
+ tests/test_node.cpp
656
+ tests/test_identify.cpp
657
+ tests/test_persistence.cpp
658
+ tests/test_event_bus.cpp
659
+ tests/test_subsystem.cpp
660
+ tests/test_pubsub.cpp
661
+ tests/test_peer_exchange.cpp
662
+ tests/test_message_json.cpp
663
+ tests/test_filexfer.cpp
664
+ tests/test_dht_discovery.cpp
665
+ tests/test_reconnection.cpp
666
+ tests/test_nat_status.cpp
667
+ tests/test_hole_punch.cpp
668
+ tests/test_logging.cpp
480
669
  )
481
670
 
482
671
  # Add BitTorrent tests if RATS_SEARCH_FEATURES is enabled
483
672
  if(RATS_SEARCH_FEATURES)
484
- list(APPEND TEST_SOURCES
485
- tests/test_bittorrent.cpp
486
- tests/test_tracker.cpp
487
- tests/test_disk_io.cpp
673
+ list(APPEND TEST_SOURCES
674
+ # Phase 0 — primitives
675
+ tests/test_bt_types.cpp
676
+ tests/test_bt_byte_io.cpp
488
677
  tests/test_bt_bitfield.cpp
678
+ # Phase 1 — metadata
489
679
  tests/test_bt_file_storage.cpp
680
+ tests/test_bt_magnet.cpp
490
681
  tests/test_bt_torrent_info.cpp
682
+ # Phase 2 — disk I/O
683
+ tests/test_bt_store_buffer.cpp
684
+ tests/test_bt_disk_io.cpp
685
+ # Phase 3 — piece picker
491
686
  tests/test_bt_piece_picker.cpp
492
- tests/test_bt_messages.cpp
493
- tests/test_bt_handshake.cpp
687
+ # Phase 4 — reactor + peer wire protocol
688
+ tests/test_bt_reactor.cpp
494
689
  tests/test_bt_peer_connection.cpp
495
- tests/test_bt_extension.cpp
496
- tests/test_bt_network.cpp
497
- tests/test_bt_integration.cpp
498
- tests/test_bt_create_torrent.cpp
690
+ # Phase 5 — torrent + client + choker
691
+ tests/test_bt_choker.cpp
692
+ tests/test_bt_download.cpp
693
+ tests/test_bt_stall_metadata.cpp
694
+ # Phase 6 — extension protocol + metadata exchange + discovery
695
+ tests/test_bt_extensions.cpp
696
+ tests/test_bt_magnet_fetch.cpp
697
+ tests/test_bt_peer_list.cpp
698
+ tests/test_bt_pex.cpp
699
+ tests/test_bt_tracker.cpp
700
+ # Phase 7 — fast resume + torrent creation
499
701
  tests/test_bt_resume_data.cpp
702
+ tests/test_bt_pause_resume.cpp
703
+ tests/test_bt_torrent_creator.cpp
704
+ # Phase 8 — node subsystem integration
705
+ tests/test_bt_subsystem.cpp
500
706
  )
501
707
  endif()
502
708
 
@@ -509,14 +715,15 @@ if(RATS_BUILD_TESTS)
509
715
  endif()
510
716
 
511
717
  if(RATS_BINDINGS)
512
- list(APPEND TEST_SOURCES
513
- tests/test_librats_c_api.cpp
718
+ list(APPEND TEST_SOURCES
719
+ tests/test_node_capi.cpp
514
720
  )
515
721
  endif()
516
722
 
517
723
  # Add mDNS tests only on non-macOS platforms
518
724
  if(NOT APPLE)
519
725
  list(APPEND TEST_SOURCES tests/test_mdns.cpp)
726
+ list(APPEND TEST_SOURCES tests/test_mdns_discovery.cpp)
520
727
  endif()
521
728
 
522
729
  # Create test executable
@@ -546,7 +753,7 @@ if(RATS_BUILD_TESTS)
546
753
  )
547
754
  endif()
548
755
 
549
- # Examples (basic examples always built; BT examples require RATS_SEARCH_FEATURES)
756
+ # Examples (opt-in; the BitTorrent example additionally requires RATS_SEARCH_FEATURES)
550
757
  if(RATS_BUILD_EXAMPLES)
551
758
  add_subdirectory(examples)
552
759
  endif()
@@ -564,20 +771,30 @@ if(RATS_INSTALL)
564
771
  ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
565
772
  LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
566
773
  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
567
- INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/librats
774
+ INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
568
775
  )
569
776
 
570
- # Headers form a tightly coupled graph (librats.h pulls in dht/krpc/bencode/
571
- # bt_*/storage/io_poller/etc.), so install the whole header tree under
572
- # include/librats/. .cpp / .c / .in files are excluded.
573
- install(DIRECTORY ${PROJECT_SOURCE_DIR}/src/
777
+ # Headers form a tightly coupled graph (node.h pulls in transport/core, and
778
+ # with the search/storage features dht/krpc/bencode/bt_*/storage too), so
779
+ # install the whole header tree. The installed layout mirrors src/librats/
780
+ # exactly, which is what keeps "librats/<subdir>/<name>.h" resolving the same
781
+ # in-tree and installed. .cpp / .c / .in files are excluded.
782
+ install(DIRECTORY ${PROJECT_SOURCE_DIR}/src/librats/
574
783
  DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/librats
575
784
  FILES_MATCHING
576
785
  PATTERN "*.h"
577
786
  PATTERN "*.hpp"
578
787
  )
579
- install(FILES ${PROJECT_BINARY_DIR}/src/version.h
580
- DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/librats
788
+ # Generated headers mirror their in-tree location (src/librats/util/<name>.h):
789
+ # sources include them as "librats/util/<name>.h", so they must land under
790
+ # librats/util/. features.h is what makes the installed tree self-describing —
791
+ # without it a consumer that does not go through the exported CMake target
792
+ # (vcpkg's MSBuild integration, a hand-rolled -I build) reads the headers with
793
+ # RATS_SEARCH_FEATURES unset even when the library was built with it.
794
+ install(FILES
795
+ ${PROJECT_BINARY_DIR}/src/librats/util/version.h
796
+ ${PROJECT_BINARY_DIR}/src/librats/util/features.h
797
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/librats/util
581
798
  )
582
799
 
583
800
  install(EXPORT ratsTargets