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,592 +0,0 @@
1
- #pragma once
2
-
3
- /**
4
- * @file bt_peer_connection.h
5
- * @brief BitTorrent peer connection management
6
- *
7
- * Handles TCP connections to peers, message buffering, and state management.
8
- */
9
-
10
- #include "bt_types.h"
11
- #include "bt_bitfield.h"
12
- #include "bt_messages.h"
13
- #include "bt_handshake.h"
14
- #include "receive_buffer.h"
15
- #include "chained_send_buffer.h"
16
-
17
- #include <vector>
18
- #include <queue>
19
- #include <chrono>
20
- #include <functional>
21
- #include <memory>
22
- #include <mutex>
23
- #include <atomic>
24
- #include <optional>
25
- #include <algorithm>
26
-
27
- namespace librats {
28
-
29
- //=============================================================================
30
- // Connection State
31
- //=============================================================================
32
-
33
- /**
34
- * @brief State of a peer connection
35
- */
36
- enum class PeerConnectionState : uint8_t {
37
- Disconnected, ///< Not connected
38
- Connecting, ///< TCP connection in progress
39
- Handshaking, ///< Waiting for handshake
40
- Connected, ///< Connected and ready
41
- Closing ///< Connection closing
42
- };
43
-
44
- /**
45
- * @brief Convert state to string
46
- */
47
- const char* peer_state_to_string(PeerConnectionState state);
48
-
49
- //=============================================================================
50
- // Peer Statistics
51
- //=============================================================================
52
-
53
- /**
54
- * @brief Statistics for a peer connection
55
- */
56
- struct PeerStats {
57
- uint64_t bytes_downloaded; ///< Total bytes downloaded from peer
58
- uint64_t bytes_uploaded; ///< Total bytes uploaded to peer
59
- uint32_t pieces_received; ///< Number of pieces received
60
- uint32_t pieces_sent; ///< Number of pieces sent
61
- uint32_t messages_received; ///< Total messages received
62
- uint32_t messages_sent; ///< Total messages sent
63
-
64
- std::chrono::steady_clock::time_point connected_at;
65
- std::chrono::steady_clock::time_point last_message_at;
66
- std::chrono::steady_clock::time_point last_piece_at;
67
-
68
- PeerStats()
69
- : bytes_downloaded(0), bytes_uploaded(0)
70
- , pieces_received(0), pieces_sent(0)
71
- , messages_received(0), messages_sent(0) {}
72
-
73
- /**
74
- * @brief Calculate download speed (bytes/sec over last interval)
75
- */
76
- double download_rate() const;
77
-
78
- /**
79
- * @brief Calculate upload speed (bytes/sec over last interval)
80
- */
81
- double upload_rate() const;
82
- };
83
-
84
- //=============================================================================
85
- // Peer Connection
86
- //=============================================================================
87
-
88
- /**
89
- * @brief Represents a connection to a BitTorrent peer
90
- *
91
- * This class manages:
92
- * - TCP connection state
93
- * - Handshake exchange
94
- * - Message buffering and parsing
95
- * - Choking/interest state
96
- * - Pending block requests
97
- *
98
- * Thread-safety: Most methods require external synchronization.
99
- * The connection uses callbacks for received data/messages.
100
- */
101
- class BtPeerConnection {
102
- public:
103
- //=========================================================================
104
- // Types
105
- //=========================================================================
106
-
107
- /// Callback for received messages
108
- using MessageCallback = std::function<void(BtPeerConnection*, const BtMessage&)>;
109
-
110
- /// Callback for connection state changes
111
- using StateCallback = std::function<void(BtPeerConnection*, PeerConnectionState)>;
112
-
113
- /// Callback for handshake completion
114
- using HandshakeCallback = std::function<void(BtPeerConnection*, const Handshake&)>;
115
-
116
- /// Callback for errors
117
- using ErrorCallback = std::function<void(BtPeerConnection*, const std::string&)>;
118
-
119
- /// Callback when info_hash is discovered (for incoming connections)
120
- using InfoHashCallback = std::function<void(BtPeerConnection*, const BtInfoHash&)>;
121
-
122
- //=========================================================================
123
- // Construction
124
- //=========================================================================
125
-
126
- /**
127
- * @brief Create a peer connection (outgoing - info_hash known)
128
- *
129
- * @param info_hash Our info hash
130
- * @param our_peer_id Our peer ID
131
- * @param num_pieces Number of pieces in torrent
132
- */
133
- BtPeerConnection(const BtInfoHash& info_hash,
134
- const PeerID& our_peer_id,
135
- uint32_t num_pieces);
136
-
137
- /**
138
- * @brief Create a peer connection (incoming - info_hash unknown until handshake)
139
- *
140
- * For incoming connections, we don't know which torrent the peer wants
141
- * until we receive their handshake. Use set_torrent_info() after handshake.
142
- *
143
- * @param our_peer_id Our peer ID
144
- */
145
- explicit BtPeerConnection(const PeerID& our_peer_id);
146
-
147
- /**
148
- * @brief Destructor
149
- */
150
- ~BtPeerConnection();
151
-
152
- //=========================================================================
153
- // Static Helpers
154
- //=========================================================================
155
-
156
- // Non-copyable
157
- BtPeerConnection(const BtPeerConnection&) = delete;
158
- BtPeerConnection& operator=(const BtPeerConnection&) = delete;
159
-
160
- // Movable
161
- BtPeerConnection(BtPeerConnection&&) noexcept;
162
- BtPeerConnection& operator=(BtPeerConnection&&) noexcept;
163
-
164
- //=========================================================================
165
- // Connection Management
166
- //=========================================================================
167
-
168
- /**
169
- * @brief Set the socket descriptor (after successful connect)
170
- */
171
- void set_socket(int socket_fd);
172
-
173
- /**
174
- * @brief Get the socket descriptor
175
- */
176
- int socket() const { return socket_fd_; }
177
-
178
- /**
179
- * @brief Set peer address for identification
180
- */
181
- void set_address(const std::string& ip, uint16_t port);
182
-
183
- /**
184
- * @brief Get peer IP address
185
- */
186
- const std::string& ip() const { return ip_; }
187
-
188
- /**
189
- * @brief Get peer port
190
- */
191
- uint16_t port() const { return port_; }
192
-
193
- /**
194
- * @brief Get connection state
195
- */
196
- PeerConnectionState state() const { return state_; }
197
-
198
- /**
199
- * @brief Check if connected and ready
200
- */
201
- bool is_connected() const { return state_ == PeerConnectionState::Connected; }
202
-
203
- /**
204
- * @brief Start handshake (send our handshake)
205
- */
206
- void start_handshake();
207
-
208
- /**
209
- * @brief Close the connection
210
- */
211
- void close();
212
-
213
- /**
214
- * @brief Check if info_hash is known (false for incoming before handshake)
215
- */
216
- bool has_info_hash() const { return info_hash_known_; }
217
-
218
- /**
219
- * @brief Get our info hash
220
- */
221
- const BtInfoHash& our_info_hash() const { return our_info_hash_; }
222
-
223
- /**
224
- * @brief Set torrent info after handshake received (for incoming connections)
225
- *
226
- * Called by NetworkManager after routing incoming connection to correct torrent.
227
- *
228
- * @param info_hash The info hash from handshake
229
- * @param num_pieces Number of pieces in torrent
230
- */
231
- void set_torrent_info(const BtInfoHash& info_hash, uint32_t num_pieces);
232
-
233
- //=========================================================================
234
- // Buffer Access (for NetworkManager)
235
- //=========================================================================
236
-
237
- /**
238
- * @brief Get receive buffer for direct recv() operations
239
- *
240
- * NetworkManager should:
241
- * 1. recv_buffer().ensure_space(bytes)
242
- * 2. recv(socket, recv_buffer().write_ptr(), recv_buffer().write_space())
243
- * 3. recv_buffer().received(bytes)
244
- * 4. process_incoming()
245
- */
246
- ReceiveBuffer& recv_buffer() { return recv_buffer_; }
247
- const ReceiveBuffer& recv_buffer() const { return recv_buffer_; }
248
-
249
- /**
250
- * @brief Get send buffer for direct send() operations
251
- *
252
- * NetworkManager should:
253
- * 1. Check !send_buffer().empty()
254
- * 2. send(socket, send_buffer().front_data(), send_buffer().front_size())
255
- * 3. send_buffer().pop_front(bytes_sent)
256
- */
257
- ChainedSendBuffer& send_buffer() { return send_buffer_; }
258
- const ChainedSendBuffer& send_buffer() const { return send_buffer_; }
259
-
260
- //=========================================================================
261
- // Data Processing
262
- //=========================================================================
263
-
264
- /**
265
- * @brief Process data in receive buffer
266
- *
267
- * Call this after data has been received into recv_buffer().
268
- * Parses handshake and messages, invokes callbacks.
269
- */
270
- void process_incoming();
271
-
272
- //=========================================================================
273
- // Callbacks
274
- //=========================================================================
275
-
276
- void set_message_callback(MessageCallback cb) { on_message_ = std::move(cb); }
277
- void set_state_callback(StateCallback cb) { on_state_change_ = std::move(cb); }
278
- void set_handshake_callback(HandshakeCallback cb) { on_handshake_ = std::move(cb); }
279
- void set_error_callback(ErrorCallback cb) { on_error_ = std::move(cb); }
280
- void set_info_hash_callback(InfoHashCallback cb) { on_info_hash_ = std::move(cb); }
281
-
282
- //=========================================================================
283
- // Protocol State
284
- //=========================================================================
285
-
286
- /**
287
- * @brief Check if we are choking the peer
288
- */
289
- bool am_choking() const { return am_choking_; }
290
-
291
- /**
292
- * @brief Check if we are interested in the peer
293
- */
294
- bool am_interested() const { return am_interested_; }
295
-
296
- /**
297
- * @brief Check if peer is choking us
298
- */
299
- bool peer_choking() const { return peer_choking_; }
300
-
301
- /**
302
- * @brief Check if peer is interested in us
303
- */
304
- bool peer_interested() const { return peer_interested_; }
305
-
306
- /**
307
- * @brief Get peer's have bitfield
308
- */
309
- const Bitfield& peer_pieces() const { return peer_pieces_; }
310
-
311
- /**
312
- * @brief Check if peer has a specific piece
313
- */
314
- bool peer_has_piece(uint32_t piece) const;
315
-
316
- /**
317
- * @brief Check if peer sent HaveAll (has all pieces)
318
- *
319
- * This is set when peer sends HaveAll message (Fast extension).
320
- * Useful when metadata is not yet available to properly size the bitfield.
321
- */
322
- bool peer_has_all() const { return peer_has_all_; }
323
-
324
- /**
325
- * @brief Get peer's info hash (from handshake)
326
- */
327
- const BtInfoHash& peer_info_hash() const { return peer_info_hash_; }
328
-
329
- /**
330
- * @brief Get peer's peer ID (from handshake)
331
- */
332
- const PeerID& peer_id() const { return peer_id_; }
333
-
334
- /**
335
- * @brief Get extension flags from handshake
336
- */
337
- const ExtensionFlags& peer_extensions() const { return peer_extensions_; }
338
-
339
- //=========================================================================
340
- // Extension Handshake Data (stored for late callback registration)
341
- //=========================================================================
342
-
343
- /**
344
- * @brief Check if we've received the peer's extension handshake
345
- */
346
- bool extension_handshake_received() const { return extension_handshake_received_; }
347
-
348
- /**
349
- * @brief Get peer's metadata size (from extension handshake, 0 if not available)
350
- */
351
- size_t peer_metadata_size() const { return peer_metadata_size_; }
352
-
353
- /**
354
- * @brief Get peer's ut_metadata message ID (from extension handshake, 0 if not supported)
355
- */
356
- uint8_t peer_ut_metadata_id() const { return peer_ut_metadata_id_; }
357
-
358
- /**
359
- * @brief Get peer's client name (from extension handshake "v" field, or identified from peer_id)
360
- */
361
- const std::string& peer_client_name() const { return peer_client_name_; }
362
-
363
- //=========================================================================
364
- // Sending Messages
365
- //=========================================================================
366
-
367
- /**
368
- * @brief Send a choke message
369
- */
370
- void send_choke();
371
-
372
- /**
373
- * @brief Send an unchoke message
374
- */
375
- void send_unchoke();
376
-
377
- /**
378
- * @brief Send an interested message
379
- */
380
- void send_interested();
381
-
382
- /**
383
- * @brief Send a not interested message
384
- */
385
- void send_not_interested();
386
-
387
- /**
388
- * @brief Send a have message
389
- */
390
- void send_have(uint32_t piece_index);
391
-
392
- /**
393
- * @brief Send our bitfield
394
- */
395
- void send_bitfield(const Bitfield& bitfield);
396
-
397
- /**
398
- * @brief Send a request message
399
- */
400
- void send_request(uint32_t piece, uint32_t begin, uint32_t length);
401
-
402
- /**
403
- * @brief Send a piece (block data)
404
- */
405
- void send_piece(uint32_t piece, uint32_t begin, const uint8_t* data, size_t length);
406
-
407
- /**
408
- * @brief Send a cancel message
409
- */
410
- void send_cancel(uint32_t piece, uint32_t begin, uint32_t length);
411
-
412
- /**
413
- * @brief Send a keep-alive
414
- */
415
- void send_keepalive();
416
-
417
- /**
418
- * @brief Send an extended message
419
- */
420
- void send_extended(uint8_t extension_id, const std::vector<uint8_t>& payload);
421
-
422
- //=========================================================================
423
- // Request Tracking
424
- //=========================================================================
425
-
426
- /**
427
- * @brief Get number of pending requests to this peer
428
- */
429
- size_t pending_requests() const { return pending_requests_.size(); }
430
-
431
- /**
432
- * @brief Get maximum allowed pending requests
433
- */
434
- size_t max_pending_requests() const { return max_pending_requests_; }
435
-
436
- /**
437
- * @brief Set maximum pending requests
438
- */
439
- void set_max_pending_requests(size_t max) { max_pending_requests_ = max; }
440
-
441
- /**
442
- * @brief Check if we can send more requests
443
- */
444
- bool can_request() const {
445
- return !peer_choking_ && pending_requests_.size() < max_pending_requests_;
446
- }
447
-
448
- /**
449
- * @brief Add a pending request
450
- */
451
- void add_pending_request(const RequestMessage& req);
452
-
453
- /**
454
- * @brief Remove a pending request (when received or cancelled)
455
- */
456
- void remove_pending_request(const RequestMessage& req);
457
-
458
- /**
459
- * @brief Check if we have a pending request for a block
460
- */
461
- bool has_pending_request(const RequestMessage& req) const {
462
- return std::find(pending_requests_.begin(), pending_requests_.end(), req)
463
- != pending_requests_.end();
464
- }
465
-
466
- /**
467
- * @brief Clear all pending requests
468
- */
469
- void clear_pending_requests();
470
-
471
- /**
472
- * @brief Get all pending requests
473
- */
474
- const std::vector<RequestMessage>& get_pending_requests() const { return pending_requests_; }
475
-
476
- /**
477
- * @brief Add an incoming request from peer (for Cancel tracking)
478
- */
479
- void add_incoming_request(const RequestMessage& req) {
480
- incoming_requests_.push_back(req);
481
- }
482
-
483
- /**
484
- * @brief Remove an incoming request (when Cancel received or piece sent)
485
- * @return true if request was found and removed
486
- */
487
- bool remove_incoming_request(const RequestMessage& req) {
488
- auto it = std::find(incoming_requests_.begin(), incoming_requests_.end(), req);
489
- if (it != incoming_requests_.end()) {
490
- incoming_requests_.erase(it);
491
- return true;
492
- }
493
- return false;
494
- }
495
-
496
- /**
497
- * @brief Check if we have a pending incoming request
498
- */
499
- bool has_incoming_request(const RequestMessage& req) const {
500
- return std::find(incoming_requests_.begin(), incoming_requests_.end(), req)
501
- != incoming_requests_.end();
502
- }
503
-
504
- //=========================================================================
505
- // Statistics
506
- //=========================================================================
507
-
508
- /**
509
- * @brief Get connection statistics
510
- */
511
- const PeerStats& stats() const { return stats_; }
512
-
513
- /**
514
- * @brief Get a mutable reference to stats
515
- */
516
- PeerStats& stats() { return stats_; }
517
-
518
- private:
519
- //=========================================================================
520
- // Internal Methods
521
- //=========================================================================
522
-
523
- void set_state(PeerConnectionState new_state);
524
- void queue_send(const std::vector<uint8_t>& data);
525
- void process_handshake();
526
- void process_messages();
527
- void handle_message(const BtMessage& msg);
528
- void parse_extension_handshake(const std::vector<uint8_t>& payload);
529
-
530
- //=========================================================================
531
- // Data Members
532
- //=========================================================================
533
-
534
- // Connection
535
- int socket_fd_;
536
- std::string ip_;
537
- uint16_t port_;
538
- std::atomic<PeerConnectionState> state_;
539
-
540
- // Our identity
541
- BtInfoHash our_info_hash_;
542
- PeerID our_peer_id_;
543
- uint32_t num_pieces_;
544
- bool info_hash_known_; ///< True if info_hash is known (false for incoming before handshake)
545
-
546
- // Peer identity (from handshake)
547
- BtInfoHash peer_info_hash_;
548
- PeerID peer_id_;
549
- ExtensionFlags peer_extensions_;
550
- bool handshake_received_;
551
- bool handshake_sent_;
552
-
553
- // Extension handshake data (stored for late callback registration)
554
- bool extension_handshake_received_;
555
- size_t peer_metadata_size_;
556
- uint8_t peer_ut_metadata_id_;
557
- std::string peer_client_name_; ///< Client name (from "v" field or peer_id identification)
558
-
559
- // Protocol state
560
- bool am_choking_;
561
- bool am_interested_;
562
- bool peer_choking_;
563
- bool peer_interested_;
564
-
565
- // Peer's pieces
566
- Bitfield peer_pieces_;
567
- bool peer_has_all_; ///< True if peer sent HaveAll (used when metadata not yet available)
568
- bool bitfield_received_; ///< True if we've received Bitfield/HaveAll/HaveNone
569
-
570
- // Buffers (single source of truth for I/O)
571
- ReceiveBuffer recv_buffer_;
572
- ChainedSendBuffer send_buffer_;
573
-
574
- // Pending requests (our requests to peer)
575
- std::vector<RequestMessage> pending_requests_;
576
- size_t max_pending_requests_;
577
-
578
- // Incoming requests (peer's requests to us) - for handling Cancel
579
- std::vector<RequestMessage> incoming_requests_;
580
-
581
- // Statistics
582
- PeerStats stats_;
583
-
584
- // Callbacks
585
- MessageCallback on_message_;
586
- StateCallback on_state_change_;
587
- HandshakeCallback on_handshake_;
588
- ErrorCallback on_error_;
589
- InfoHashCallback on_info_hash_;
590
- };
591
-
592
- } // namespace librats