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,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