librats 1.0.2 → 2.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (313) hide show
  1. package/README.md +137 -332
  2. package/binding.gyp +16 -3
  3. package/lib/index.d.ts +271 -696
  4. package/lib/index.js +383 -44
  5. package/native-src/3rdparty/android/ifaddrs-android.c +1 -0
  6. package/native-src/3rdparty/android/ifaddrs-android.h +1 -0
  7. package/native-src/CMakeLists.txt +396 -179
  8. package/native-src/LICENSE +1 -1
  9. package/native-src/src/librats/bindings/rats.cpp +731 -0
  10. package/native-src/src/librats/bindings/rats.h +352 -0
  11. package/native-src/src/librats/bittorrent/bencode.cpp +437 -0
  12. package/native-src/src/librats/bittorrent/bencode.h +176 -0
  13. package/native-src/src/librats/bittorrent/bitfield.cpp +97 -0
  14. package/native-src/src/librats/bittorrent/bitfield.h +76 -0
  15. package/native-src/src/librats/bittorrent/byte_io.h +58 -0
  16. package/native-src/src/librats/bittorrent/choker.cpp +25 -0
  17. package/native-src/src/librats/bittorrent/choker.h +46 -0
  18. package/native-src/src/librats/bittorrent/client.cpp +413 -0
  19. package/native-src/src/librats/bittorrent/client.h +227 -0
  20. package/native-src/src/librats/bittorrent/disk_io.cpp +209 -0
  21. package/native-src/src/librats/bittorrent/disk_io.h +150 -0
  22. package/native-src/src/librats/bittorrent/extensions.cpp +191 -0
  23. package/native-src/src/librats/bittorrent/extensions.h +94 -0
  24. package/native-src/src/librats/bittorrent/file_storage.cpp +77 -0
  25. package/native-src/src/librats/bittorrent/file_storage.h +79 -0
  26. package/native-src/src/librats/bittorrent/log.h +42 -0
  27. package/native-src/src/librats/bittorrent/magnet_uri.cpp +98 -0
  28. package/native-src/src/librats/bittorrent/magnet_uri.h +35 -0
  29. package/native-src/src/librats/bittorrent/peer_connection.cpp +502 -0
  30. package/native-src/src/librats/bittorrent/peer_connection.h +194 -0
  31. package/native-src/src/librats/bittorrent/peer_list.cpp +68 -0
  32. package/native-src/src/librats/bittorrent/peer_list.h +75 -0
  33. package/native-src/src/librats/bittorrent/piece_picker.cpp +352 -0
  34. package/native-src/src/librats/bittorrent/piece_picker.h +201 -0
  35. package/native-src/src/librats/bittorrent/reactor.cpp +97 -0
  36. package/native-src/src/librats/bittorrent/reactor.h +89 -0
  37. package/native-src/src/librats/bittorrent/resume_data.cpp +72 -0
  38. package/native-src/src/librats/bittorrent/resume_data.h +41 -0
  39. package/native-src/src/librats/bittorrent/store_buffer.cpp +48 -0
  40. package/native-src/src/librats/bittorrent/store_buffer.h +47 -0
  41. package/native-src/src/librats/bittorrent/torrent.cpp +870 -0
  42. package/native-src/src/librats/bittorrent/torrent.h +260 -0
  43. package/native-src/src/librats/bittorrent/torrent_creator.cpp +129 -0
  44. package/native-src/src/librats/bittorrent/torrent_creator.h +58 -0
  45. package/native-src/src/librats/bittorrent/torrent_info.cpp +314 -0
  46. package/native-src/src/librats/bittorrent/torrent_info.h +118 -0
  47. package/native-src/src/librats/bittorrent/tracker.cpp +374 -0
  48. package/native-src/src/librats/bittorrent/tracker.h +108 -0
  49. package/native-src/src/librats/bittorrent/types.cpp +206 -0
  50. package/native-src/src/librats/bittorrent/types.h +86 -0
  51. package/native-src/src/librats/core/address.cpp +35 -0
  52. package/native-src/src/librats/core/address.h +78 -0
  53. package/native-src/src/librats/core/bytes.h +69 -0
  54. package/native-src/src/librats/core/chained_send_buffer.cpp +172 -0
  55. package/native-src/src/librats/core/chained_send_buffer.h +183 -0
  56. package/native-src/src/librats/core/endpoint_parse.cpp +41 -0
  57. package/native-src/src/librats/core/endpoint_parse.h +31 -0
  58. package/native-src/src/librats/core/event_bus.h +70 -0
  59. package/native-src/src/librats/core/host_endpoint.h +56 -0
  60. package/native-src/src/{io_poller.cpp → librats/core/io_poller.cpp} +520 -65
  61. package/native-src/src/{io_poller.h → librats/core/io_poller.h} +12 -6
  62. package/native-src/src/librats/core/ip_address.cpp +120 -0
  63. package/native-src/src/librats/core/ip_address.h +109 -0
  64. package/native-src/src/librats/core/mpsc_queue.h +47 -0
  65. package/native-src/src/librats/core/notifier.h +74 -0
  66. package/native-src/src/librats/core/receive_buffer.cpp +219 -0
  67. package/native-src/src/librats/core/receive_buffer.h +171 -0
  68. package/native-src/src/librats/core/service_registry.h +58 -0
  69. package/native-src/src/{socket.cpp → librats/core/socket.cpp} +625 -118
  70. package/native-src/src/librats/core/socket.h +496 -0
  71. package/native-src/src/librats/core/timer_queue.h +105 -0
  72. package/native-src/src/librats/core/types.cpp +42 -0
  73. package/native-src/src/librats/core/types.h +93 -0
  74. package/native-src/src/librats/core/wakeup_pipe.h +83 -0
  75. package/native-src/src/{crypto → librats/crypto}/blake2_endian.h +21 -23
  76. package/native-src/src/{crypto → librats/crypto}/blake2b.c +34 -33
  77. package/native-src/src/{crypto → librats/crypto}/blake2b.h +7 -6
  78. package/native-src/src/{crypto → librats/crypto}/blake2s.c +55 -54
  79. package/native-src/src/{crypto → librats/crypto}/blake2s.h +13 -12
  80. package/native-src/src/{crypto → librats/crypto}/chacha.c +22 -21
  81. package/native-src/src/{crypto → librats/crypto}/chacha.h +14 -13
  82. package/native-src/src/{crypto → librats/crypto}/chachapoly.c +56 -56
  83. package/native-src/src/{crypto → librats/crypto}/chachapoly.h +24 -17
  84. package/native-src/src/{crc32.cpp → librats/crypto/crc32.cpp} +1 -1
  85. package/native-src/src/{crc32.h → librats/crypto/crc32.h} +3 -1
  86. package/native-src/src/{crypto → librats/crypto}/curve25519.c +6 -4
  87. package/native-src/src/{crypto → librats/crypto}/curve25519.h +6 -3
  88. package/native-src/src/librats/crypto/hkdf.c +266 -0
  89. package/native-src/src/{crypto → librats/crypto}/hkdf.h +19 -19
  90. package/native-src/src/{noise.cpp → librats/crypto/noise.cpp} +84 -73
  91. package/native-src/src/{noise.h → librats/crypto/noise.h} +18 -8
  92. package/native-src/src/{crypto → librats/crypto}/poly1305.c +47 -46
  93. package/native-src/src/librats/crypto/poly1305.h +37 -0
  94. package/native-src/src/{sha1.cpp → librats/crypto/sha1.cpp} +33 -1
  95. package/native-src/src/{sha1.h → librats/crypto/sha1.h} +14 -6
  96. package/native-src/src/{crypto → librats/crypto}/sha256.c +15 -14
  97. package/native-src/src/{crypto → librats/crypto}/sha256.h +8 -7
  98. package/native-src/src/{crypto → librats/crypto}/sha512.c +15 -14
  99. package/native-src/src/{crypto → librats/crypto}/sha512.h +8 -7
  100. package/native-src/src/librats/dht/announce.cpp +37 -0
  101. package/native-src/src/librats/dht/announce.h +41 -0
  102. package/native-src/src/librats/dht/bep42.cpp +109 -0
  103. package/native-src/src/librats/dht/bep42.h +48 -0
  104. package/native-src/src/librats/dht/dht.cpp +501 -0
  105. package/native-src/src/librats/dht/dht.h +119 -0
  106. package/native-src/src/librats/dht/dht_runner.cpp +103 -0
  107. package/native-src/src/librats/dht/dht_runner.h +71 -0
  108. package/native-src/src/librats/dht/dos_blocker.cpp +42 -0
  109. package/native-src/src/librats/dht/dos_blocker.h +47 -0
  110. package/native-src/src/librats/dht/find_peers.cpp +52 -0
  111. package/native-src/src/librats/dht/find_peers.h +73 -0
  112. package/native-src/src/librats/dht/id.h +167 -0
  113. package/native-src/src/{krpc.cpp → librats/dht/krpc.cpp} +32 -81
  114. package/native-src/src/{krpc.h → librats/dht/krpc.h} +19 -23
  115. package/native-src/src/librats/dht/log.h +38 -0
  116. package/native-src/src/librats/dht/node.cpp +473 -0
  117. package/native-src/src/librats/dht/node.h +164 -0
  118. package/native-src/src/librats/dht/node_entry.h +81 -0
  119. package/native-src/src/librats/dht/observer.h +72 -0
  120. package/native-src/src/librats/dht/persistence.cpp +90 -0
  121. package/native-src/src/librats/dht/persistence.h +32 -0
  122. package/native-src/src/librats/dht/routing_table.cpp +559 -0
  123. package/native-src/src/librats/dht/routing_table.h +185 -0
  124. package/native-src/src/librats/dht/rpc_manager.cpp +127 -0
  125. package/native-src/src/librats/dht/rpc_manager.h +77 -0
  126. package/native-src/src/librats/dht/storage.cpp +92 -0
  127. package/native-src/src/librats/dht/storage.h +74 -0
  128. package/native-src/src/librats/dht/transport.h +27 -0
  129. package/native-src/src/librats/dht/traversal.cpp +326 -0
  130. package/native-src/src/librats/dht/traversal.h +120 -0
  131. package/native-src/src/librats/dht/udp_transport.cpp +49 -0
  132. package/native-src/src/librats/dht/udp_transport.h +51 -0
  133. package/native-src/src/librats/mdns/log.h +22 -0
  134. package/native-src/src/{mdns.cpp → librats/mdns/mdns.cpp} +75 -40
  135. package/native-src/src/{mdns.h → librats/mdns/mdns.h} +9 -8
  136. package/native-src/src/{natpmp.cpp → librats/nat/natpmp.cpp} +12 -9
  137. package/native-src/src/{natpmp.h → librats/nat/natpmp.h} +3 -3
  138. package/native-src/src/{port_mapping.h → librats/nat/port_mapping.h} +3 -2
  139. package/native-src/src/{stun.cpp → librats/nat/stun.cpp} +4 -4
  140. package/native-src/src/{stun.h → librats/nat/stun.h} +1 -1
  141. package/native-src/src/{upnp.cpp → librats/nat/upnp.cpp} +6 -6
  142. package/native-src/src/{upnp.h → librats/nat/upnp.h} +2 -2
  143. package/native-src/src/librats/node/config.h +110 -0
  144. package/native-src/src/librats/node/dial_service.h +54 -0
  145. package/native-src/src/librats/node/dialer.cpp +264 -0
  146. package/native-src/src/librats/node/dialer.h +188 -0
  147. package/native-src/src/librats/node/host_events.h +26 -0
  148. package/native-src/src/librats/node/identify.cpp +130 -0
  149. package/native-src/src/librats/node/identify.h +71 -0
  150. package/native-src/src/librats/node/nat_status.cpp +103 -0
  151. package/native-src/src/librats/node/nat_status.h +118 -0
  152. package/native-src/src/librats/node/node.cpp +826 -0
  153. package/native-src/src/librats/node/node.h +333 -0
  154. package/native-src/src/librats/node/node_context.h +33 -0
  155. package/native-src/src/librats/node/peer_network.h +91 -0
  156. package/native-src/src/librats/peer/peer.h +49 -0
  157. package/native-src/src/librats/peer/peer_book.cpp +181 -0
  158. package/native-src/src/librats/peer/peer_book.h +88 -0
  159. package/native-src/src/librats/peer/peer_id.cpp +72 -0
  160. package/native-src/src/librats/peer/peer_id.h +62 -0
  161. package/native-src/src/librats/peer/peer_info.h +37 -0
  162. package/native-src/src/librats/peer/peer_table.cpp +137 -0
  163. package/native-src/src/librats/peer/peer_table.h +148 -0
  164. package/native-src/src/librats/security/handshaker.h +66 -0
  165. package/native-src/src/librats/security/identity.h +43 -0
  166. package/native-src/src/librats/security/noise_security.cpp +122 -0
  167. package/native-src/src/librats/security/noise_security.h +37 -0
  168. package/native-src/src/librats/security/plaintext_security.h +106 -0
  169. package/native-src/src/librats/security/session.h +37 -0
  170. package/native-src/src/{storage.cpp → librats/storage/storage.cpp} +369 -522
  171. package/native-src/src/{storage.h → librats/storage/storage.h} +135 -299
  172. package/native-src/src/librats/subsystems/bittorrent.cpp +211 -0
  173. package/native-src/src/librats/subsystems/bittorrent.h +136 -0
  174. package/native-src/src/librats/subsystems/dht_discovery.cpp +202 -0
  175. package/native-src/src/librats/subsystems/dht_discovery.h +123 -0
  176. package/native-src/src/librats/subsystems/dht_service.h +36 -0
  177. package/native-src/src/librats/subsystems/file_transfer.cpp +972 -0
  178. package/native-src/src/librats/subsystems/file_transfer.h +367 -0
  179. package/native-src/src/librats/subsystems/hole_punch.cpp +532 -0
  180. package/native-src/src/librats/subsystems/hole_punch.h +266 -0
  181. package/native-src/src/librats/subsystems/hole_punch_service.h +38 -0
  182. package/native-src/src/librats/subsystems/mdns_discovery.cpp +66 -0
  183. package/native-src/src/librats/subsystems/mdns_discovery.h +55 -0
  184. package/native-src/src/librats/subsystems/message_json.cpp +112 -0
  185. package/native-src/src/librats/subsystems/message_json.h +88 -0
  186. package/native-src/src/librats/subsystems/peer_exchange.cpp +241 -0
  187. package/native-src/src/librats/subsystems/peer_exchange.h +136 -0
  188. package/native-src/src/librats/subsystems/ping_service.cpp +98 -0
  189. package/native-src/src/librats/subsystems/ping_service.h +66 -0
  190. package/native-src/src/librats/subsystems/port_mapping_service.cpp +192 -0
  191. package/native-src/src/librats/subsystems/port_mapping_service.h +84 -0
  192. package/native-src/src/librats/subsystems/pubsub.cpp +567 -0
  193. package/native-src/src/librats/subsystems/pubsub.h +175 -0
  194. package/native-src/src/librats/subsystems/reconnection.cpp +239 -0
  195. package/native-src/src/librats/subsystems/reconnection.h +126 -0
  196. package/native-src/src/librats/transport/connection.cpp +343 -0
  197. package/native-src/src/librats/transport/connection.h +283 -0
  198. package/native-src/src/librats/transport/link.h +96 -0
  199. package/native-src/src/librats/transport/reactor.cpp +540 -0
  200. package/native-src/src/librats/transport/reactor.h +224 -0
  201. package/native-src/src/librats/transport/reactor_pool.h +81 -0
  202. package/native-src/src/librats/transport/tcp_link.cpp +49 -0
  203. package/native-src/src/librats/transport/tcp_link.h +43 -0
  204. package/native-src/src/librats/transport/udp_mux.cpp +617 -0
  205. package/native-src/src/librats/transport/udp_mux.h +363 -0
  206. package/native-src/src/librats/transport/udp_packet.cpp +121 -0
  207. package/native-src/src/librats/transport/udp_packet.h +190 -0
  208. package/native-src/src/librats/transport/udp_stream.cpp +1194 -0
  209. package/native-src/src/librats/transport/udp_stream.h +614 -0
  210. package/native-src/src/librats/util/features.h.in +51 -0
  211. package/native-src/src/{fs.cpp → librats/util/fs.cpp} +51 -3
  212. package/native-src/src/librats/util/fs.h +136 -0
  213. package/native-src/src/librats/util/json.cpp +1002 -0
  214. package/native-src/src/librats/util/json.h +444 -0
  215. package/native-src/src/{logger.cpp → librats/util/logger.cpp} +1 -1
  216. package/native-src/src/{logger.h → librats/util/logger.h} +43 -31
  217. package/native-src/src/{network_monitor.cpp → librats/util/network_monitor.cpp} +12 -4
  218. package/native-src/src/{network_monitor.h → librats/util/network_monitor.h} +2 -1
  219. package/native-src/src/{network_utils.cpp → librats/util/network_utils.cpp} +38 -23
  220. package/native-src/src/{network_utils.h → librats/util/network_utils.h} +15 -8
  221. package/native-src/src/{os.cpp → librats/util/os.cpp} +48 -18
  222. package/native-src/src/librats/util/rats_export.h +69 -0
  223. package/native-src/src/{version.cpp → librats/util/version.cpp} +2 -2
  224. package/native-src/src/{version.h.in → librats/util/version.h.in} +1 -1
  225. package/native-src/src/librats/wire/frame.cpp +76 -0
  226. package/native-src/src/librats/wire/frame.h +110 -0
  227. package/native-src/src/librats/wire/message_router.cpp +45 -0
  228. package/native-src/src/librats/wire/message_router.h +47 -0
  229. package/package.json +5 -4
  230. package/scripts/build-librats.js +1 -0
  231. package/scripts/postinstall.js +3 -3
  232. package/scripts/prepare-package.js +4 -4
  233. package/scripts/verify-installation.js +63 -105
  234. package/src/librats_node.cpp +1042 -1324
  235. package/native-src/src/bencode.cpp +0 -485
  236. package/native-src/src/bencode.h +0 -145
  237. package/native-src/src/bittorrent.cpp +0 -14
  238. package/native-src/src/bittorrent.h +0 -74
  239. package/native-src/src/bt_bitfield.cpp +0 -372
  240. package/native-src/src/bt_bitfield.h +0 -316
  241. package/native-src/src/bt_choker.cpp +0 -228
  242. package/native-src/src/bt_choker.h +0 -147
  243. package/native-src/src/bt_client.cpp +0 -1047
  244. package/native-src/src/bt_client.h +0 -445
  245. package/native-src/src/bt_create_torrent.cpp +0 -677
  246. package/native-src/src/bt_create_torrent.h +0 -473
  247. package/native-src/src/bt_extension.cpp +0 -469
  248. package/native-src/src/bt_extension.h +0 -309
  249. package/native-src/src/bt_file_storage.cpp +0 -261
  250. package/native-src/src/bt_file_storage.h +0 -298
  251. package/native-src/src/bt_handshake.cpp +0 -134
  252. package/native-src/src/bt_handshake.h +0 -157
  253. package/native-src/src/bt_messages.cpp +0 -364
  254. package/native-src/src/bt_messages.h +0 -324
  255. package/native-src/src/bt_network.cpp +0 -1007
  256. package/native-src/src/bt_network.h +0 -417
  257. package/native-src/src/bt_peer_connection.cpp +0 -742
  258. package/native-src/src/bt_peer_connection.h +0 -592
  259. package/native-src/src/bt_piece_picker.cpp +0 -786
  260. package/native-src/src/bt_piece_picker.h +0 -473
  261. package/native-src/src/bt_resume_data.cpp +0 -410
  262. package/native-src/src/bt_resume_data.h +0 -249
  263. package/native-src/src/bt_torrent.cpp +0 -2120
  264. package/native-src/src/bt_torrent.h +0 -641
  265. package/native-src/src/bt_torrent_info.cpp +0 -659
  266. package/native-src/src/bt_torrent_info.h +0 -418
  267. package/native-src/src/bt_types.h +0 -621
  268. package/native-src/src/chained_send_buffer.cpp +0 -75
  269. package/native-src/src/chained_send_buffer.h +0 -137
  270. package/native-src/src/crypto/hkdf.c +0 -266
  271. package/native-src/src/crypto/poly1305.h +0 -36
  272. package/native-src/src/dht.cpp +0 -3311
  273. package/native-src/src/dht.h +0 -717
  274. package/native-src/src/disk_io.cpp +0 -632
  275. package/native-src/src/disk_io.h +0 -315
  276. package/native-src/src/file_transfer.cpp +0 -1415
  277. package/native-src/src/file_transfer.h +0 -286
  278. package/native-src/src/fs.h +0 -108
  279. package/native-src/src/gossipsub.cpp +0 -1139
  280. package/native-src/src/gossipsub.h +0 -403
  281. package/native-src/src/ice.cpp +0 -893
  282. package/native-src/src/ice.h +0 -559
  283. package/native-src/src/json.hpp +0 -25526
  284. package/native-src/src/librats.cpp +0 -2378
  285. package/native-src/src/librats.h +0 -2324
  286. package/native-src/src/librats_bittorrent.cpp +0 -601
  287. package/native-src/src/librats_c.cpp +0 -1557
  288. package/native-src/src/librats_c.h +0 -323
  289. package/native-src/src/librats_discovery.cpp +0 -402
  290. package/native-src/src/librats_encryption.cpp +0 -275
  291. package/native-src/src/librats_file_transfer.cpp +0 -144
  292. package/native-src/src/librats_gossipsub.cpp +0 -289
  293. package/native-src/src/librats_ice.cpp +0 -213
  294. package/native-src/src/librats_log_macros.h +0 -36
  295. package/native-src/src/librats_logging.cpp +0 -173
  296. package/native-src/src/librats_mdns.cpp +0 -166
  297. package/native-src/src/librats_persistence.cpp +0 -796
  298. package/native-src/src/librats_portmap.cpp +0 -419
  299. package/native-src/src/librats_reconnection.cpp +0 -218
  300. package/native-src/src/librats_statistic.cpp +0 -105
  301. package/native-src/src/librats_storage.cpp +0 -189
  302. package/native-src/src/rats_export.h +0 -17
  303. package/native-src/src/receive_buffer.cpp +0 -82
  304. package/native-src/src/receive_buffer.h +0 -127
  305. package/native-src/src/socket.h +0 -228
  306. package/native-src/src/threadmanager.cpp +0 -105
  307. package/native-src/src/threadmanager.h +0 -53
  308. package/native-src/src/tracker.cpp +0 -1264
  309. package/native-src/src/tracker.h +0 -319
  310. package/native-src/src/turn.cpp +0 -762
  311. package/native-src/src/turn.h +0 -460
  312. package/native-src/src/wakeup_pipe.h +0 -60
  313. /package/native-src/src/{os.h → librats/util/os.h} +0 -0
@@ -1,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