librats 1.0.2 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (319) hide show
  1. package/README.md +145 -331
  2. package/binding.gyp +16 -3
  3. package/lib/index.d.ts +288 -696
  4. package/lib/index.js +407 -44
  5. package/native-src/3rdparty/android/ifaddrs-android.c +1 -0
  6. package/native-src/3rdparty/android/ifaddrs-android.h +1 -0
  7. package/native-src/CMakeLists.txt +404 -179
  8. package/native-src/LICENSE +1 -1
  9. package/native-src/src/librats/bindings/rats.cpp +762 -0
  10. package/native-src/src/librats/bindings/rats.h +380 -0
  11. package/native-src/src/librats/bittorrent/bencode.cpp +437 -0
  12. package/native-src/src/librats/bittorrent/bencode.h +176 -0
  13. package/native-src/src/librats/bittorrent/bitfield.cpp +97 -0
  14. package/native-src/src/librats/bittorrent/bitfield.h +76 -0
  15. package/native-src/src/librats/bittorrent/byte_io.h +58 -0
  16. package/native-src/src/librats/bittorrent/choker.cpp +25 -0
  17. package/native-src/src/librats/bittorrent/choker.h +46 -0
  18. package/native-src/src/librats/bittorrent/client.cpp +413 -0
  19. package/native-src/src/librats/bittorrent/client.h +227 -0
  20. package/native-src/src/librats/bittorrent/disk_io.cpp +209 -0
  21. package/native-src/src/librats/bittorrent/disk_io.h +150 -0
  22. package/native-src/src/librats/bittorrent/extensions.cpp +191 -0
  23. package/native-src/src/librats/bittorrent/extensions.h +94 -0
  24. package/native-src/src/librats/bittorrent/file_storage.cpp +77 -0
  25. package/native-src/src/librats/bittorrent/file_storage.h +79 -0
  26. package/native-src/src/librats/bittorrent/log.h +42 -0
  27. package/native-src/src/librats/bittorrent/magnet_uri.cpp +98 -0
  28. package/native-src/src/librats/bittorrent/magnet_uri.h +35 -0
  29. package/native-src/src/librats/bittorrent/peer_connection.cpp +502 -0
  30. package/native-src/src/librats/bittorrent/peer_connection.h +194 -0
  31. package/native-src/src/librats/bittorrent/peer_list.cpp +68 -0
  32. package/native-src/src/librats/bittorrent/peer_list.h +75 -0
  33. package/native-src/src/librats/bittorrent/piece_picker.cpp +352 -0
  34. package/native-src/src/librats/bittorrent/piece_picker.h +201 -0
  35. package/native-src/src/librats/bittorrent/reactor.cpp +97 -0
  36. package/native-src/src/librats/bittorrent/reactor.h +89 -0
  37. package/native-src/src/librats/bittorrent/resume_data.cpp +72 -0
  38. package/native-src/src/librats/bittorrent/resume_data.h +41 -0
  39. package/native-src/src/librats/bittorrent/store_buffer.cpp +48 -0
  40. package/native-src/src/librats/bittorrent/store_buffer.h +47 -0
  41. package/native-src/src/librats/bittorrent/torrent.cpp +870 -0
  42. package/native-src/src/librats/bittorrent/torrent.h +260 -0
  43. package/native-src/src/librats/bittorrent/torrent_creator.cpp +129 -0
  44. package/native-src/src/librats/bittorrent/torrent_creator.h +58 -0
  45. package/native-src/src/librats/bittorrent/torrent_info.cpp +314 -0
  46. package/native-src/src/librats/bittorrent/torrent_info.h +118 -0
  47. package/native-src/src/librats/bittorrent/tracker.cpp +374 -0
  48. package/native-src/src/librats/bittorrent/tracker.h +108 -0
  49. package/native-src/src/librats/bittorrent/types.cpp +206 -0
  50. package/native-src/src/librats/bittorrent/types.h +86 -0
  51. package/native-src/src/librats/core/address.cpp +35 -0
  52. package/native-src/src/librats/core/address.h +78 -0
  53. package/native-src/src/librats/core/bytes.h +69 -0
  54. package/native-src/src/librats/core/chained_send_buffer.cpp +172 -0
  55. package/native-src/src/librats/core/chained_send_buffer.h +183 -0
  56. package/native-src/src/librats/core/endpoint_parse.cpp +41 -0
  57. package/native-src/src/librats/core/endpoint_parse.h +31 -0
  58. package/native-src/src/librats/core/event_bus.h +70 -0
  59. package/native-src/src/librats/core/host_endpoint.h +56 -0
  60. package/native-src/src/{io_poller.cpp → librats/core/io_poller.cpp} +520 -65
  61. package/native-src/src/{io_poller.h → librats/core/io_poller.h} +12 -6
  62. package/native-src/src/librats/core/ip_address.cpp +120 -0
  63. package/native-src/src/librats/core/ip_address.h +109 -0
  64. package/native-src/src/librats/core/mpsc_queue.h +47 -0
  65. package/native-src/src/librats/core/notifier.h +74 -0
  66. package/native-src/src/librats/core/receive_buffer.cpp +219 -0
  67. package/native-src/src/librats/core/receive_buffer.h +171 -0
  68. package/native-src/src/librats/core/service_registry.h +58 -0
  69. package/native-src/src/{socket.cpp → librats/core/socket.cpp} +625 -118
  70. package/native-src/src/librats/core/socket.h +496 -0
  71. package/native-src/src/librats/core/timer_queue.h +105 -0
  72. package/native-src/src/librats/core/types.cpp +43 -0
  73. package/native-src/src/librats/core/types.h +103 -0
  74. package/native-src/src/librats/core/wakeup_pipe.h +83 -0
  75. package/native-src/src/{crypto → librats/crypto}/blake2_endian.h +21 -23
  76. package/native-src/src/{crypto → librats/crypto}/blake2b.c +34 -33
  77. package/native-src/src/{crypto → librats/crypto}/blake2b.h +7 -6
  78. package/native-src/src/{crypto → librats/crypto}/blake2s.c +55 -54
  79. package/native-src/src/{crypto → librats/crypto}/blake2s.h +13 -12
  80. package/native-src/src/{crypto → librats/crypto}/chacha.c +22 -21
  81. package/native-src/src/{crypto → librats/crypto}/chacha.h +14 -13
  82. package/native-src/src/{crypto → librats/crypto}/chachapoly.c +56 -56
  83. package/native-src/src/{crypto → librats/crypto}/chachapoly.h +24 -17
  84. package/native-src/src/{crc32.cpp → librats/crypto/crc32.cpp} +1 -1
  85. package/native-src/src/{crc32.h → librats/crypto/crc32.h} +3 -1
  86. package/native-src/src/{crypto → librats/crypto}/curve25519.c +6 -4
  87. package/native-src/src/{crypto → librats/crypto}/curve25519.h +6 -3
  88. package/native-src/src/librats/crypto/hkdf.c +266 -0
  89. package/native-src/src/{crypto → librats/crypto}/hkdf.h +19 -19
  90. package/native-src/src/{noise.cpp → librats/crypto/noise.cpp} +84 -73
  91. package/native-src/src/{noise.h → librats/crypto/noise.h} +18 -8
  92. package/native-src/src/{crypto → librats/crypto}/poly1305.c +47 -46
  93. package/native-src/src/librats/crypto/poly1305.h +37 -0
  94. package/native-src/src/{sha1.cpp → librats/crypto/sha1.cpp} +33 -1
  95. package/native-src/src/{sha1.h → librats/crypto/sha1.h} +14 -6
  96. package/native-src/src/{crypto → librats/crypto}/sha256.c +15 -14
  97. package/native-src/src/{crypto → librats/crypto}/sha256.h +8 -7
  98. package/native-src/src/{crypto → librats/crypto}/sha512.c +15 -14
  99. package/native-src/src/{crypto → librats/crypto}/sha512.h +8 -7
  100. package/native-src/src/librats/dht/announce.cpp +37 -0
  101. package/native-src/src/librats/dht/announce.h +41 -0
  102. package/native-src/src/librats/dht/bep42.cpp +109 -0
  103. package/native-src/src/librats/dht/bep42.h +48 -0
  104. package/native-src/src/librats/dht/dht.cpp +501 -0
  105. package/native-src/src/librats/dht/dht.h +119 -0
  106. package/native-src/src/librats/dht/dht_runner.cpp +103 -0
  107. package/native-src/src/librats/dht/dht_runner.h +71 -0
  108. package/native-src/src/librats/dht/dos_blocker.cpp +42 -0
  109. package/native-src/src/librats/dht/dos_blocker.h +47 -0
  110. package/native-src/src/librats/dht/find_peers.cpp +52 -0
  111. package/native-src/src/librats/dht/find_peers.h +73 -0
  112. package/native-src/src/librats/dht/id.h +167 -0
  113. package/native-src/src/{krpc.cpp → librats/dht/krpc.cpp} +32 -81
  114. package/native-src/src/{krpc.h → librats/dht/krpc.h} +19 -23
  115. package/native-src/src/librats/dht/log.h +38 -0
  116. package/native-src/src/librats/dht/node.cpp +473 -0
  117. package/native-src/src/librats/dht/node.h +164 -0
  118. package/native-src/src/librats/dht/node_entry.h +81 -0
  119. package/native-src/src/librats/dht/observer.h +72 -0
  120. package/native-src/src/librats/dht/persistence.cpp +90 -0
  121. package/native-src/src/librats/dht/persistence.h +32 -0
  122. package/native-src/src/librats/dht/routing_table.cpp +559 -0
  123. package/native-src/src/librats/dht/routing_table.h +185 -0
  124. package/native-src/src/librats/dht/rpc_manager.cpp +127 -0
  125. package/native-src/src/librats/dht/rpc_manager.h +77 -0
  126. package/native-src/src/librats/dht/storage.cpp +92 -0
  127. package/native-src/src/librats/dht/storage.h +74 -0
  128. package/native-src/src/librats/dht/transport.h +27 -0
  129. package/native-src/src/librats/dht/traversal.cpp +326 -0
  130. package/native-src/src/librats/dht/traversal.h +120 -0
  131. package/native-src/src/librats/dht/udp_transport.cpp +49 -0
  132. package/native-src/src/librats/dht/udp_transport.h +51 -0
  133. package/native-src/src/librats/mdns/log.h +22 -0
  134. package/native-src/src/{mdns.cpp → librats/mdns/mdns.cpp} +75 -40
  135. package/native-src/src/{mdns.h → librats/mdns/mdns.h} +9 -8
  136. package/native-src/src/{natpmp.cpp → librats/nat/natpmp.cpp} +12 -9
  137. package/native-src/src/{natpmp.h → librats/nat/natpmp.h} +3 -3
  138. package/native-src/src/{port_mapping.h → librats/nat/port_mapping.h} +3 -2
  139. package/native-src/src/{stun.cpp → librats/nat/stun.cpp} +4 -4
  140. package/native-src/src/{stun.h → librats/nat/stun.h} +1 -1
  141. package/native-src/src/{upnp.cpp → librats/nat/upnp.cpp} +6 -6
  142. package/native-src/src/{upnp.h → librats/nat/upnp.h} +2 -2
  143. package/native-src/src/librats/node/circuit_service.h +84 -0
  144. package/native-src/src/librats/node/config.h +110 -0
  145. package/native-src/src/librats/node/dial_service.h +54 -0
  146. package/native-src/src/librats/node/dialer.cpp +264 -0
  147. package/native-src/src/librats/node/dialer.h +188 -0
  148. package/native-src/src/librats/node/host_events.h +26 -0
  149. package/native-src/src/librats/node/identify.cpp +130 -0
  150. package/native-src/src/librats/node/identify.h +71 -0
  151. package/native-src/src/librats/node/nat_status.cpp +103 -0
  152. package/native-src/src/librats/node/nat_status.h +118 -0
  153. package/native-src/src/librats/node/node.cpp +865 -0
  154. package/native-src/src/librats/node/node.h +344 -0
  155. package/native-src/src/librats/node/node_context.h +33 -0
  156. package/native-src/src/librats/node/peer_network.h +91 -0
  157. package/native-src/src/librats/peer/peer.h +49 -0
  158. package/native-src/src/librats/peer/peer_book.cpp +181 -0
  159. package/native-src/src/librats/peer/peer_book.h +88 -0
  160. package/native-src/src/librats/peer/peer_id.cpp +72 -0
  161. package/native-src/src/librats/peer/peer_id.h +62 -0
  162. package/native-src/src/librats/peer/peer_info.h +37 -0
  163. package/native-src/src/librats/peer/peer_table.cpp +170 -0
  164. package/native-src/src/librats/peer/peer_table.h +148 -0
  165. package/native-src/src/librats/security/handshaker.h +66 -0
  166. package/native-src/src/librats/security/identity.h +43 -0
  167. package/native-src/src/librats/security/noise_security.cpp +122 -0
  168. package/native-src/src/librats/security/noise_security.h +37 -0
  169. package/native-src/src/librats/security/plaintext_security.h +106 -0
  170. package/native-src/src/librats/security/session.h +37 -0
  171. package/native-src/src/{storage.cpp → librats/storage/storage.cpp} +369 -522
  172. package/native-src/src/{storage.h → librats/storage/storage.h} +135 -299
  173. package/native-src/src/librats/subsystems/bittorrent.cpp +211 -0
  174. package/native-src/src/librats/subsystems/bittorrent.h +136 -0
  175. package/native-src/src/librats/subsystems/dht_discovery.cpp +202 -0
  176. package/native-src/src/librats/subsystems/dht_discovery.h +123 -0
  177. package/native-src/src/librats/subsystems/dht_service.h +36 -0
  178. package/native-src/src/librats/subsystems/file_transfer.cpp +972 -0
  179. package/native-src/src/librats/subsystems/file_transfer.h +367 -0
  180. package/native-src/src/librats/subsystems/hole_punch.cpp +605 -0
  181. package/native-src/src/librats/subsystems/hole_punch.h +290 -0
  182. package/native-src/src/librats/subsystems/hole_punch_service.h +38 -0
  183. package/native-src/src/librats/subsystems/mdns_discovery.cpp +66 -0
  184. package/native-src/src/librats/subsystems/mdns_discovery.h +55 -0
  185. package/native-src/src/librats/subsystems/message_json.cpp +112 -0
  186. package/native-src/src/librats/subsystems/message_json.h +88 -0
  187. package/native-src/src/librats/subsystems/peer_exchange.cpp +241 -0
  188. package/native-src/src/librats/subsystems/peer_exchange.h +136 -0
  189. package/native-src/src/librats/subsystems/ping_service.cpp +98 -0
  190. package/native-src/src/librats/subsystems/ping_service.h +66 -0
  191. package/native-src/src/librats/subsystems/port_mapping_service.cpp +192 -0
  192. package/native-src/src/librats/subsystems/port_mapping_service.h +84 -0
  193. package/native-src/src/librats/subsystems/pubsub.cpp +567 -0
  194. package/native-src/src/librats/subsystems/pubsub.h +175 -0
  195. package/native-src/src/librats/subsystems/reconnection.cpp +239 -0
  196. package/native-src/src/librats/subsystems/reconnection.h +126 -0
  197. package/native-src/src/librats/subsystems/relay.cpp +1142 -0
  198. package/native-src/src/librats/subsystems/relay.h +211 -0
  199. package/native-src/src/librats/subsystems/relay_service.h +46 -0
  200. package/native-src/src/librats/transport/connection.cpp +343 -0
  201. package/native-src/src/librats/transport/connection.h +283 -0
  202. package/native-src/src/librats/transport/link.h +96 -0
  203. package/native-src/src/librats/transport/reactor.cpp +588 -0
  204. package/native-src/src/librats/transport/reactor.h +262 -0
  205. package/native-src/src/librats/transport/reactor_pool.h +81 -0
  206. package/native-src/src/librats/transport/relay_link.cpp +208 -0
  207. package/native-src/src/librats/transport/relay_link.h +303 -0
  208. package/native-src/src/librats/transport/tcp_link.cpp +49 -0
  209. package/native-src/src/librats/transport/tcp_link.h +43 -0
  210. package/native-src/src/librats/transport/udp_mux.cpp +617 -0
  211. package/native-src/src/librats/transport/udp_mux.h +363 -0
  212. package/native-src/src/librats/transport/udp_packet.cpp +121 -0
  213. package/native-src/src/librats/transport/udp_packet.h +190 -0
  214. package/native-src/src/librats/transport/udp_stream.cpp +1194 -0
  215. package/native-src/src/librats/transport/udp_stream.h +614 -0
  216. package/native-src/src/librats/util/features.h.in +51 -0
  217. package/native-src/src/{fs.cpp → librats/util/fs.cpp} +51 -3
  218. package/native-src/src/librats/util/fs.h +136 -0
  219. package/native-src/src/librats/util/json.cpp +1002 -0
  220. package/native-src/src/librats/util/json.h +444 -0
  221. package/native-src/src/{logger.cpp → librats/util/logger.cpp} +1 -1
  222. package/native-src/src/{logger.h → librats/util/logger.h} +43 -31
  223. package/native-src/src/{network_monitor.cpp → librats/util/network_monitor.cpp} +12 -4
  224. package/native-src/src/{network_monitor.h → librats/util/network_monitor.h} +2 -1
  225. package/native-src/src/{network_utils.cpp → librats/util/network_utils.cpp} +38 -23
  226. package/native-src/src/{network_utils.h → librats/util/network_utils.h} +15 -8
  227. package/native-src/src/{os.cpp → librats/util/os.cpp} +48 -18
  228. package/native-src/src/librats/util/rats_export.h +69 -0
  229. package/native-src/src/{version.cpp → librats/util/version.cpp} +2 -2
  230. package/native-src/src/{version.h.in → librats/util/version.h.in} +1 -1
  231. package/native-src/src/librats/wire/frame.cpp +76 -0
  232. package/native-src/src/librats/wire/frame.h +111 -0
  233. package/native-src/src/librats/wire/message_router.cpp +45 -0
  234. package/native-src/src/librats/wire/message_router.h +47 -0
  235. package/package.json +5 -4
  236. package/scripts/build-librats.js +1 -0
  237. package/scripts/postinstall.js +3 -3
  238. package/scripts/prepare-package.js +4 -4
  239. package/scripts/verify-installation.js +63 -105
  240. package/src/librats_node.cpp +1067 -1323
  241. package/native-src/src/bencode.cpp +0 -485
  242. package/native-src/src/bencode.h +0 -145
  243. package/native-src/src/bittorrent.cpp +0 -14
  244. package/native-src/src/bittorrent.h +0 -74
  245. package/native-src/src/bt_bitfield.cpp +0 -372
  246. package/native-src/src/bt_bitfield.h +0 -316
  247. package/native-src/src/bt_choker.cpp +0 -228
  248. package/native-src/src/bt_choker.h +0 -147
  249. package/native-src/src/bt_client.cpp +0 -1047
  250. package/native-src/src/bt_client.h +0 -445
  251. package/native-src/src/bt_create_torrent.cpp +0 -677
  252. package/native-src/src/bt_create_torrent.h +0 -473
  253. package/native-src/src/bt_extension.cpp +0 -469
  254. package/native-src/src/bt_extension.h +0 -309
  255. package/native-src/src/bt_file_storage.cpp +0 -261
  256. package/native-src/src/bt_file_storage.h +0 -298
  257. package/native-src/src/bt_handshake.cpp +0 -134
  258. package/native-src/src/bt_handshake.h +0 -157
  259. package/native-src/src/bt_messages.cpp +0 -364
  260. package/native-src/src/bt_messages.h +0 -324
  261. package/native-src/src/bt_network.cpp +0 -1007
  262. package/native-src/src/bt_network.h +0 -417
  263. package/native-src/src/bt_peer_connection.cpp +0 -742
  264. package/native-src/src/bt_peer_connection.h +0 -592
  265. package/native-src/src/bt_piece_picker.cpp +0 -786
  266. package/native-src/src/bt_piece_picker.h +0 -473
  267. package/native-src/src/bt_resume_data.cpp +0 -410
  268. package/native-src/src/bt_resume_data.h +0 -249
  269. package/native-src/src/bt_torrent.cpp +0 -2120
  270. package/native-src/src/bt_torrent.h +0 -641
  271. package/native-src/src/bt_torrent_info.cpp +0 -659
  272. package/native-src/src/bt_torrent_info.h +0 -418
  273. package/native-src/src/bt_types.h +0 -621
  274. package/native-src/src/chained_send_buffer.cpp +0 -75
  275. package/native-src/src/chained_send_buffer.h +0 -137
  276. package/native-src/src/crypto/hkdf.c +0 -266
  277. package/native-src/src/crypto/poly1305.h +0 -36
  278. package/native-src/src/dht.cpp +0 -3311
  279. package/native-src/src/dht.h +0 -717
  280. package/native-src/src/disk_io.cpp +0 -632
  281. package/native-src/src/disk_io.h +0 -315
  282. package/native-src/src/file_transfer.cpp +0 -1415
  283. package/native-src/src/file_transfer.h +0 -286
  284. package/native-src/src/fs.h +0 -108
  285. package/native-src/src/gossipsub.cpp +0 -1139
  286. package/native-src/src/gossipsub.h +0 -403
  287. package/native-src/src/ice.cpp +0 -893
  288. package/native-src/src/ice.h +0 -559
  289. package/native-src/src/json.hpp +0 -25526
  290. package/native-src/src/librats.cpp +0 -2378
  291. package/native-src/src/librats.h +0 -2324
  292. package/native-src/src/librats_bittorrent.cpp +0 -601
  293. package/native-src/src/librats_c.cpp +0 -1557
  294. package/native-src/src/librats_c.h +0 -323
  295. package/native-src/src/librats_discovery.cpp +0 -402
  296. package/native-src/src/librats_encryption.cpp +0 -275
  297. package/native-src/src/librats_file_transfer.cpp +0 -144
  298. package/native-src/src/librats_gossipsub.cpp +0 -289
  299. package/native-src/src/librats_ice.cpp +0 -213
  300. package/native-src/src/librats_log_macros.h +0 -36
  301. package/native-src/src/librats_logging.cpp +0 -173
  302. package/native-src/src/librats_mdns.cpp +0 -166
  303. package/native-src/src/librats_persistence.cpp +0 -796
  304. package/native-src/src/librats_portmap.cpp +0 -419
  305. package/native-src/src/librats_reconnection.cpp +0 -218
  306. package/native-src/src/librats_statistic.cpp +0 -105
  307. package/native-src/src/librats_storage.cpp +0 -189
  308. package/native-src/src/rats_export.h +0 -17
  309. package/native-src/src/receive_buffer.cpp +0 -82
  310. package/native-src/src/receive_buffer.h +0 -127
  311. package/native-src/src/socket.h +0 -228
  312. package/native-src/src/threadmanager.cpp +0 -105
  313. package/native-src/src/threadmanager.h +0 -53
  314. package/native-src/src/tracker.cpp +0 -1264
  315. package/native-src/src/tracker.h +0 -319
  316. package/native-src/src/turn.cpp +0 -762
  317. package/native-src/src/turn.h +0 -460
  318. package/native-src/src/wakeup_pipe.h +0 -60
  319. /package/native-src/src/{os.h → librats/util/os.h} +0 -0
@@ -1,417 +0,0 @@
1
- #pragma once
2
-
3
- /**
4
- * @file bt_network.h
5
- * @brief Async network layer for BitTorrent peer connections
6
- *
7
- * Provides efficient multiplexed I/O for managing multiple peer connections
8
- * using platform-optimal I/O polling (epoll/kqueue/WSAPoll).
9
- * Buffers are owned by BtPeerConnection (single source of truth) -
10
- * this class only handles socket I/O.
11
- */
12
-
13
- #include "bt_types.h"
14
- #include "bt_peer_connection.h"
15
- #include "io_poller.h"
16
- #include "socket.h"
17
-
18
- #include <vector>
19
- #include <queue>
20
- #include <unordered_map>
21
- #include <memory>
22
- #include <mutex>
23
- #include <atomic>
24
- #include <thread>
25
- #include <functional>
26
- #include <chrono>
27
-
28
- namespace librats {
29
-
30
- //=============================================================================
31
- // Network Configuration
32
- //=============================================================================
33
-
34
- /**
35
- * @brief Configuration for the network manager
36
- */
37
- struct BtNetworkConfig {
38
- uint16_t listen_port; ///< Port for incoming connections (0 = random)
39
- size_t max_connections; ///< Maximum total connections
40
- bool enable_incoming; ///< Accept incoming connections
41
- int connect_timeout_ms; ///< Timeout for outgoing connections (ms)
42
- int poll_timeout_ms; ///< Timeout for I/O poll (ms)
43
- size_t send_buffer_high_water; ///< High water mark for send buffer
44
- PeerID peer_id; ///< Our peer ID (for incoming connections)
45
-
46
- BtNetworkConfig()
47
- : listen_port(6881)
48
- , max_connections(200)
49
- , enable_incoming(true)
50
- , connect_timeout_ms(30000)
51
- , poll_timeout_ms(15)
52
- , send_buffer_high_water(1024 * 1024) // 1MB
53
- , peer_id{} {}
54
- };
55
-
56
- //=============================================================================
57
- // Connection State
58
- //=============================================================================
59
-
60
- /**
61
- * @brief State of a network connection
62
- */
63
- enum class NetConnectionState : uint8_t {
64
- Connecting, ///< TCP connect in progress
65
- Handshaking, ///< Waiting for BitTorrent handshake
66
- Connected, ///< Fully connected and operational
67
- Closing ///< Connection being closed
68
- };
69
-
70
- /**
71
- * @brief Information about a pending outgoing connection
72
- */
73
- struct PendingConnect {
74
- std::string ip;
75
- uint16_t port;
76
- BtInfoHash info_hash;
77
- PeerID peer_id;
78
- uint32_t num_pieces;
79
- socket_t socket;
80
- std::chrono::steady_clock::time_point start_time;
81
-
82
- PendingConnect() : port(0), num_pieces(0), socket(INVALID_SOCKET_VALUE) {}
83
- };
84
-
85
- /**
86
- * @brief Per-socket connection context
87
- *
88
- * Note: Buffers are now owned by BtPeerConnection (single source of truth).
89
- * This struct only holds socket state and connection reference.
90
- */
91
- struct SocketContext {
92
- socket_t socket;
93
- BtInfoHash info_hash;
94
- std::shared_ptr<BtPeerConnection> connection;
95
- NetConnectionState state;
96
- bool incoming;
97
- std::chrono::steady_clock::time_point connected_at;
98
- std::chrono::steady_clock::time_point last_activity;
99
-
100
- SocketContext()
101
- : socket(INVALID_SOCKET_VALUE)
102
- , state(NetConnectionState::Connecting)
103
- , incoming(false) {}
104
- };
105
-
106
- /**
107
- * @brief Per-torrent registration info
108
- */
109
- struct TorrentRegistration {
110
- BtInfoHash info_hash;
111
- PeerID peer_id;
112
- uint32_t num_pieces;
113
-
114
- TorrentRegistration() : num_pieces(0) {}
115
- };
116
-
117
- //=============================================================================
118
- // Deferred Callback Events (to avoid deadlocks)
119
- //=============================================================================
120
-
121
- /**
122
- * @brief Event for connected callback (deferred)
123
- */
124
- struct ConnectedEvent {
125
- BtInfoHash info_hash;
126
- std::shared_ptr<BtPeerConnection> connection;
127
- socket_t socket;
128
- bool incoming;
129
- };
130
-
131
- /**
132
- * @brief Event for data callback (deferred)
133
- */
134
- struct DataEvent {
135
- BtInfoHash info_hash;
136
- std::shared_ptr<BtPeerConnection> connection;
137
- socket_t socket;
138
- };
139
-
140
- /**
141
- * @brief Event for disconnected callback (deferred)
142
- */
143
- struct DisconnectedEvent {
144
- BtInfoHash info_hash;
145
- std::shared_ptr<BtPeerConnection> connection;
146
- };
147
-
148
- //=============================================================================
149
- // Network Manager
150
- //=============================================================================
151
-
152
- /**
153
- * @brief Manages all BitTorrent peer connections
154
- *
155
- * Provides async I/O via platform-optimal multiplexing:
156
- * - Linux: epoll (O(1) per event)
157
- * - macOS: kqueue (O(1) per event)
158
- * - Windows: WSAPoll (no FD_SETSIZE limit)
159
- *
160
- * Features:
161
- * - Listens for incoming connections
162
- * - Manages outgoing connection queue
163
- * - Handles non-blocking reads/writes
164
- * - TCP_NODELAY for low-latency messaging
165
- * - Invokes callbacks for events
166
- *
167
- * Thread-safety: The manager runs its own I/O thread.
168
- * Callbacks are invoked from the I/O thread.
169
- * Public methods are thread-safe.
170
- */
171
- class BtNetworkManager {
172
- public:
173
- //=========================================================================
174
- // Types
175
- //=========================================================================
176
-
177
- /// Callback when a peer connection is established (handshake complete)
178
- using ConnectedCallback = std::function<void(
179
- const BtInfoHash& info_hash,
180
- std::shared_ptr<BtPeerConnection> connection,
181
- socket_t socket,
182
- bool incoming
183
- )>;
184
-
185
- /// Callback when a peer disconnects
186
- using DisconnectedCallback = std::function<void(
187
- const BtInfoHash& info_hash,
188
- BtPeerConnection* connection
189
- )>;
190
-
191
- /// Callback when data is received and processed
192
- using DataCallback = std::function<void(
193
- const BtInfoHash& info_hash,
194
- BtPeerConnection* connection,
195
- socket_t socket
196
- )>;
197
-
198
- //=========================================================================
199
- // Construction
200
- //=========================================================================
201
-
202
- /**
203
- * @brief Create network manager with config
204
- */
205
- explicit BtNetworkManager(const BtNetworkConfig& config);
206
-
207
- /**
208
- * @brief Destructor - stops the manager
209
- */
210
- ~BtNetworkManager();
211
-
212
- // Non-copyable
213
- BtNetworkManager(const BtNetworkManager&) = delete;
214
- BtNetworkManager& operator=(const BtNetworkManager&) = delete;
215
-
216
- //=========================================================================
217
- // Lifecycle
218
- //=========================================================================
219
-
220
- /**
221
- * @brief Start the network manager
222
- *
223
- * Creates listen socket and starts I/O thread.
224
- *
225
- * @return true if started successfully
226
- */
227
- bool start();
228
-
229
- /**
230
- * @brief Stop the network manager
231
- *
232
- * Closes all connections and stops I/O thread.
233
- */
234
- void stop();
235
-
236
- /**
237
- * @brief Check if manager is running
238
- */
239
- bool is_running() const { return running_; }
240
-
241
- /**
242
- * @brief Get the actual listen port
243
- */
244
- uint16_t listen_port() const { return actual_listen_port_; }
245
-
246
- //=========================================================================
247
- // Torrent Registration
248
- //=========================================================================
249
-
250
- /**
251
- * @brief Register a torrent to accept connections for
252
- *
253
- * @param info_hash Torrent info hash
254
- * @param peer_id Our peer ID
255
- * @param num_pieces Number of pieces in torrent
256
- */
257
- void register_torrent(const BtInfoHash& info_hash,
258
- const PeerID& peer_id,
259
- uint32_t num_pieces);
260
-
261
- /**
262
- * @brief Unregister a torrent
263
- *
264
- * Closes all connections for this torrent.
265
- */
266
- void unregister_torrent(const BtInfoHash& info_hash);
267
-
268
- //=========================================================================
269
- // Connection Management
270
- //=========================================================================
271
-
272
- /**
273
- * @brief Initiate connection to a peer
274
- *
275
- * @param ip Peer IP address
276
- * @param port Peer port
277
- * @param info_hash Torrent info hash
278
- * @param peer_id Our peer ID
279
- * @param num_pieces Number of pieces (0 for magnet links)
280
- * @return true if connection was queued
281
- */
282
- bool connect_peer(const std::string& ip, uint16_t port,
283
- const BtInfoHash& info_hash,
284
- const PeerID& peer_id,
285
- uint32_t num_pieces);
286
-
287
- /**
288
- * @brief Close a connection
289
- *
290
- * @param socket Socket to close
291
- */
292
- void close_connection(socket_t socket);
293
-
294
- /**
295
- * @brief Send data to a peer
296
- *
297
- * Queues data in the send buffer; actual send is async.
298
- *
299
- * @param socket Target socket
300
- * @param data Data to send
301
- * @return true if queued successfully
302
- */
303
- bool send_to_peer(socket_t socket, const std::vector<uint8_t>& data);
304
-
305
- /**
306
- * @brief Get number of active connections
307
- */
308
- size_t connection_count() const;
309
-
310
- /**
311
- * @brief Get number of pending outgoing connections
312
- */
313
- size_t pending_connect_count() const;
314
-
315
- //=========================================================================
316
- // Callbacks
317
- //=========================================================================
318
-
319
- void set_connected_callback(ConnectedCallback cb) {
320
- on_connected_ = std::move(cb);
321
- }
322
-
323
- void set_disconnected_callback(DisconnectedCallback cb) {
324
- on_disconnected_ = std::move(cb);
325
- }
326
-
327
- void set_data_callback(DataCallback cb) {
328
- on_data_ = std::move(cb);
329
- }
330
-
331
- private:
332
- //=========================================================================
333
- // Internal Methods
334
- //=========================================================================
335
-
336
- /// Main I/O loop (runs in separate thread)
337
- void io_loop();
338
-
339
- /// Synchronize poller state with current connections (under mutex)
340
- void sync_poller();
341
-
342
- /// Process the queue of pending connections
343
- void process_pending_connects();
344
-
345
- /// Accept incoming connections
346
- void accept_incoming();
347
-
348
- /// Handle readable socket (returns true if connection should be closed)
349
- bool handle_readable(socket_t socket,
350
- std::vector<ConnectedEvent>& connected_events,
351
- std::vector<DataEvent>& data_events);
352
-
353
- /// Handle writable socket (drain send buffer, returns true if connection should be closed)
354
- bool handle_writable(socket_t socket);
355
-
356
- /// Handle data received from a peer (returns true if connection should be closed)
357
- bool handle_peer_data(SocketContext& ctx,
358
- std::vector<ConnectedEvent>& connected_events,
359
- std::vector<DataEvent>& data_events);
360
-
361
- /// Close connection with cleanup (collects disconnected events)
362
- void close_connection_internal(socket_t socket,
363
- std::vector<DisconnectedEvent>& disconnected_events);
364
-
365
- /// Flush send buffers for a socket (returns true if connection should be closed)
366
- bool flush_send_buffer(SocketContext& ctx);
367
-
368
- /// Create socket for outgoing connection
369
- socket_t create_connect_socket(const std::string& ip, uint16_t port);
370
-
371
- /// Handle info_hash discovered from incoming connection handshake
372
- void on_incoming_info_hash(BtPeerConnection* conn, const BtInfoHash& info_hash);
373
-
374
- /// Set TCP_NODELAY on a socket (disable Nagle's algorithm)
375
- static bool set_tcp_nodelay(socket_t sock);
376
-
377
- //=========================================================================
378
- // Data Members
379
- //=========================================================================
380
-
381
- BtNetworkConfig config_;
382
-
383
- std::atomic<bool> running_;
384
- std::atomic<uint16_t> actual_listen_port_;
385
-
386
- socket_t listen_socket_;
387
-
388
- mutable std::mutex mutex_;
389
-
390
- /// Platform-optimal I/O poller (epoll/kqueue/WSAPoll)
391
- std::unique_ptr<IOPoller> poller_;
392
-
393
- /// Tracks current poller event mask per socket (to avoid redundant modify calls)
394
- std::unordered_map<socket_t, uint32_t> poller_state_;
395
-
396
- /// Active connections by socket
397
- std::unordered_map<socket_t, SocketContext> connections_;
398
-
399
- /// Registered torrents by info hash
400
- std::unordered_map<BtInfoHash, TorrentRegistration, InfoHashHash> torrents_;
401
-
402
- /// Queue of pending outgoing connections
403
- std::queue<PendingConnect> pending_connects_;
404
-
405
- /// Pending connects that are in progress (by socket)
406
- std::unordered_map<socket_t, PendingConnect> connecting_;
407
-
408
- /// I/O thread
409
- std::thread io_thread_;
410
-
411
- /// Callbacks
412
- ConnectedCallback on_connected_;
413
- DisconnectedCallback on_disconnected_;
414
- DataCallback on_data_;
415
- };
416
-
417
- } // namespace librats