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
@@ -0,0 +1,51 @@
1
+ #pragma once
2
+
3
+ /**
4
+ * @file features.h
5
+ * @brief How this copy of librats was built: which optional modules it contains,
6
+ * and whether it is a DLL.
7
+ *
8
+ * Generated by CMake from features.h.in — do not edit the generated copy.
9
+ *
10
+ * All three macros are build-time switches that change the *installed headers*,
11
+ * not just which .cpp files compile, so a consumer reading the headers with one
12
+ * of them in a different state than the library was built with sees something
13
+ * other than what it links against:
14
+ *
15
+ * - RATS_SEARCH_FEATURES — dht/dht.h, dht/node.h and subsystems/bittorrent.h
16
+ * declare the spider API behind it, and dht::Node declares *data members*
17
+ * behind it. Getting it wrong is a missing declaration at best and a silently
18
+ * different object layout at worst.
19
+ * - RATS_STORAGE — same mechanism; no installed header tests it today.
20
+ * - RATS_IMPORT_DLL — MSVC only: without it RATS_API expands to nothing, so a
21
+ * consumer of the shared build compiles as if the library were static and
22
+ * loses __declspec(dllimport) on every exported symbol (see rats_export.h).
23
+ * Not set for a static build, where the same define would send the consumer
24
+ * looking for __imp_-prefixed symbols that do not exist. RATS_EXPORT_DLL is
25
+ * deliberately absent: it is PRIVATE to the library's own translation units,
26
+ * and rats_export.h tests it first, so it still wins there.
27
+ *
28
+ * CMakeLists.txt also sets these on the `rats` target (PUBLIC for the features,
29
+ * INTERFACE for RATS_IMPORT_DLL), so a consumer using find_package(rats CONFIG) +
30
+ * rats::rats gets them via INTERFACE_COMPILE_DEFINITIONS. That path alone is not
31
+ * enough: vcpkg's MSBuild integration, a hand-rolled -I<prefix>/include build, and
32
+ * IDE indexers never read the CMake target. Recording the answers in an installed
33
+ * header makes the headers self-describing for every consumer, whatever their
34
+ * build system, and removes the need for Conan's package_info() to repeat them.
35
+ *
36
+ * Included from rats_export.h, which practically every public header pulls in,
37
+ * so the macros are set before any #ifdef that tests them. The #ifndef guards
38
+ * keep the definition benign when the compile definition already supplied it.
39
+ */
40
+
41
+ #ifndef RATS_SEARCH_FEATURES
42
+ #cmakedefine RATS_SEARCH_FEATURES
43
+ #endif
44
+
45
+ #ifndef RATS_STORAGE
46
+ #cmakedefine RATS_STORAGE
47
+ #endif
48
+
49
+ #ifndef RATS_IMPORT_DLL
50
+ #cmakedefine RATS_IMPORT_DLL
51
+ #endif
@@ -1,5 +1,5 @@
1
- #include "fs.h"
2
- #include "logger.h"
1
+ #include "librats/util/fs.h"
2
+ #include "librats/util/logger.h"
3
3
  #include <cstring>
4
4
  #include <cstdlib>
5
5
  #include <sys/stat.h>
@@ -520,9 +520,57 @@ bool create_file_with_size(const char* path, uint64_t size) {
520
520
  return true;
521
521
  }
522
522
 
523
+ // ── FileStream: one open handle across many positioned operations ──────────────
524
+
525
+ static bool fs_seek64(FILE* f, uint64_t offset) {
526
+ #ifdef _WIN32
527
+ return _fseeki64(f, static_cast<__int64>(offset), SEEK_SET) == 0;
528
+ #else
529
+ return fseeko(f, static_cast<off_t>(offset), SEEK_SET) == 0;
530
+ #endif
531
+ }
532
+
533
+ bool FileStream::open_read(const char* path) {
534
+ close();
535
+ if (!path) return false;
536
+ f_ = fopen(path, "rb");
537
+ if (!f_) { LOG_ERROR("FS", "FileStream: cannot open for reading: " << path); return false; }
538
+ return true;
539
+ }
540
+
541
+ bool FileStream::open_write(const char* path) {
542
+ close();
543
+ if (!path) return false;
544
+ f_ = fopen(path, "r+b"); // keep existing content (positioned writes)
545
+ if (!f_ && !file_exists(path)) {
546
+ std::string parent = get_parent_directory(path);
547
+ if (!parent.empty() && !directory_exists(parent.c_str())) create_directories(parent.c_str());
548
+ f_ = fopen(path, "w+b"); // create fresh
549
+ }
550
+ if (!f_) { LOG_ERROR("FS", "FileStream: cannot open for writing: " << path); return false; }
551
+ return true;
552
+ }
553
+
554
+ bool FileStream::seek(uint64_t offset) { return f_ && fs_seek64(f_, offset); }
555
+
556
+ size_t FileStream::read(void* buffer, size_t size) {
557
+ if (!f_ || !buffer) return 0;
558
+ return fread(buffer, 1, size, f_);
559
+ }
560
+
561
+ bool FileStream::write_at(uint64_t offset, const void* data, size_t size) {
562
+ if (!f_ || !data) return false;
563
+ if (!fs_seek64(f_, offset)) return false;
564
+ return fwrite(data, 1, size, f_) == size;
565
+ }
566
+
567
+ void FileStream::close() {
568
+ if (f_) { fclose(f_); f_ = nullptr; }
569
+ }
570
+
523
571
  bool rename_file(const char* old_path, const char* new_path) {
524
572
  if (!old_path || !new_path) return false;
525
-
573
+
526
574
  return rename(old_path, new_path) == 0;
527
575
  }
528
576
 
@@ -0,0 +1,136 @@
1
+ #pragma once
2
+
3
+ #include <string>
4
+ #include <vector>
5
+ #include <cstdint>
6
+ #include <cstdio>
7
+ #include "librats/util/rats_export.h"
8
+
9
+ namespace librats {
10
+
11
+ // File/Directory existence check
12
+ RATS_API bool file_or_directory_exists(const char* path);
13
+ RATS_API bool directory_exists(const char* path);
14
+ RATS_API bool file_exists(const char* path);
15
+
16
+ // File creation and writing
17
+ RATS_API bool create_file(const char* path, const char* content);
18
+ RATS_API bool create_file_binary(const char* path, const void* data, size_t size);
19
+ RATS_API bool append_to_file(const char* path, const char* content);
20
+
21
+ // File reading
22
+ RATS_API char* read_file_text(const char* path, size_t* size_out = nullptr);
23
+ RATS_API void* read_file_binary(const char* path, size_t* size_out);
24
+
25
+ // Directory operations
26
+ RATS_API bool create_directory(const char* path);
27
+ RATS_API bool create_directories(const char* path); // Create parent directories if needed
28
+
29
+ // File information
30
+ RATS_API int64_t get_file_size(const char* path);
31
+ RATS_API bool is_file(const char* path);
32
+ RATS_API bool is_directory(const char* path);
33
+
34
+ // File operations
35
+ RATS_API bool delete_file(const char* path);
36
+ RATS_API bool delete_directory(const char* path);
37
+ RATS_API bool copy_file(const char* src_path, const char* dest_path);
38
+ RATS_API bool move_file(const char* src_path, const char* dest_path);
39
+
40
+ // File metadata operations
41
+ RATS_API uint64_t get_file_modified_time(const char* path);
42
+ RATS_API std::string get_file_extension(const char* path);
43
+ RATS_API std::string get_filename_from_path(const char* path);
44
+ RATS_API std::string get_parent_directory(const char* path);
45
+
46
+ // File chunk operations
47
+ RATS_API bool write_file_chunk(const char* path, uint64_t offset, const void* data, size_t size);
48
+ RATS_API bool read_file_chunk(const char* path, uint64_t offset, void* buffer, size_t size);
49
+
50
+ // Advanced file operations
51
+ RATS_API bool create_file_with_size(const char* path, uint64_t size); // Pre-allocate file space
52
+ RATS_API bool rename_file(const char* old_path, const char* new_path);
53
+
54
+ // A file kept open across many positioned reads/writes. Streaming a large file
55
+ // then costs one open()/close() instead of one per chunk (see read_file_chunk /
56
+ // write_file_chunk, which re-open every call). 64-bit offsets. NOT thread-safe:
57
+ // a stream is meant to be owned by a single thread at a time.
58
+ class RATS_API FileStream {
59
+ public:
60
+ FileStream() = default;
61
+ ~FileStream() { close(); }
62
+ FileStream(const FileStream&) = delete;
63
+ FileStream& operator=(const FileStream&) = delete;
64
+ FileStream(FileStream&& o) noexcept : f_(o.f_) { o.f_ = nullptr; }
65
+ FileStream& operator=(FileStream&& o) noexcept {
66
+ if (this != &o) { close(); f_ = o.f_; o.f_ = nullptr; }
67
+ return *this;
68
+ }
69
+
70
+ bool open_read(const char* path); ///< open an existing file for reading
71
+ bool open_write(const char* path); ///< open (creating parents+file if needed) for writing
72
+ bool seek(uint64_t offset); ///< reposition the cursor
73
+ size_t read(void* buffer, size_t size); ///< sequential read; returns bytes read
74
+ bool write_at(uint64_t offset, const void* data, size_t size); ///< positioned write
75
+ void close();
76
+ bool is_open() const { return f_ != nullptr; }
77
+
78
+ private:
79
+ FILE* f_ = nullptr;
80
+ };
81
+
82
+ // Directory listing
83
+ struct DirectoryEntry {
84
+ std::string name;
85
+ std::string path;
86
+ bool is_directory;
87
+ uint64_t size;
88
+ uint64_t modified_time;
89
+ };
90
+ RATS_API bool list_directory(const char* path, std::vector<DirectoryEntry>& entries);
91
+
92
+ // Path utilities
93
+ RATS_API std::string combine_paths(const std::string& base, const std::string& relative);
94
+ RATS_API bool validate_path(const char* path, bool check_write_access = false);
95
+
96
+ // Utility functions
97
+ RATS_API void free_file_buffer(void* buffer); // Free memory allocated by read functions
98
+ RATS_API bool get_current_directory(char* buffer, size_t buffer_size);
99
+ RATS_API bool set_current_directory(const char* path);
100
+
101
+ // C++ convenience wrappers
102
+ inline bool file_or_directory_exists(const std::string& path) { return file_or_directory_exists(path.c_str()); }
103
+ inline bool file_exists(const std::string& path) { return file_exists(path.c_str()); }
104
+ inline bool directory_exists(const std::string& path) { return directory_exists(path.c_str()); }
105
+ inline bool create_file(const std::string& path, const std::string& content) {
106
+ return create_file(path.c_str(), content.c_str());
107
+ }
108
+ inline std::string read_file_text_cpp(const std::string& path) {
109
+ size_t size;
110
+ char* content = read_file_text(path.c_str(), &size);
111
+ if (!content) return "";
112
+ std::string result(content, size);
113
+ free_file_buffer(content);
114
+ return result;
115
+ }
116
+
117
+ // Additional C++ wrappers for new functions
118
+ inline uint64_t get_file_modified_time(const std::string& path) { return get_file_modified_time(path.c_str()); }
119
+ inline std::string get_file_extension(const std::string& path) { return get_file_extension(path.c_str()); }
120
+ inline std::string get_filename_from_path(const std::string& path) { return get_filename_from_path(path.c_str()); }
121
+ inline std::string get_parent_directory(const std::string& path) { return get_parent_directory(path.c_str()); }
122
+ inline bool write_file_chunk(const std::string& path, uint64_t offset, const void* data, size_t size) {
123
+ return write_file_chunk(path.c_str(), offset, data, size);
124
+ }
125
+ inline bool read_file_chunk(const std::string& path, uint64_t offset, void* buffer, size_t size) {
126
+ return read_file_chunk(path.c_str(), offset, buffer, size);
127
+ }
128
+ inline bool create_file_with_size(const std::string& path, uint64_t size) { return create_file_with_size(path.c_str(), size); }
129
+ inline bool rename_file(const std::string& old_path, const std::string& new_path) {
130
+ return rename_file(old_path.c_str(), new_path.c_str());
131
+ }
132
+ inline bool validate_path(const std::string& path, bool check_write_access = false) {
133
+ return validate_path(path.c_str(), check_write_access);
134
+ }
135
+
136
+ } // namespace librats