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,559 +0,0 @@
1
- #pragma once
2
-
3
- /**
4
- * @file ice.h
5
- * @brief ICE-lite (Interactive Connectivity Establishment) Implementation
6
- *
7
- * Implements RFC 5245 ICE-lite for NAT traversal.
8
- * Provides candidate gathering, connectivity checks, and connection establishment.
9
- *
10
- * ICE-lite is a minimal implementation suitable for servers and most P2P scenarios.
11
- * It doesn't perform full ICE with controlling/controlled roles negotiation.
12
- */
13
-
14
- #include "stun.h"
15
- #include "turn.h"
16
- #include "socket.h"
17
- #include <vector>
18
- #include <string>
19
- #include <optional>
20
- #include <memory>
21
- #include <mutex>
22
- #include <functional>
23
- #include <chrono>
24
- #include <atomic>
25
- #include <thread>
26
-
27
- namespace librats {
28
-
29
- // ============================================================================
30
- // ICE Constants
31
- // ============================================================================
32
-
33
- /// Default ICE candidate priority for host candidates
34
- constexpr uint32_t ICE_PRIORITY_HOST = 126;
35
-
36
- /// Default ICE candidate priority for server-reflexive candidates
37
- constexpr uint32_t ICE_PRIORITY_SRFLX = 100;
38
-
39
- /// Default ICE candidate priority for relay candidates
40
- constexpr uint32_t ICE_PRIORITY_RELAY = 0;
41
-
42
- /// Connectivity check timeout (ms)
43
- constexpr int ICE_CHECK_TIMEOUT_MS = 500;
44
-
45
- /// Maximum connectivity check retries
46
- constexpr int ICE_CHECK_MAX_RETRIES = 5;
47
-
48
- // ============================================================================
49
- // ICE Data Structures
50
- // ============================================================================
51
-
52
- /**
53
- * ICE candidate type
54
- */
55
- enum class IceCandidateType {
56
- Host, ///< Local interface address
57
- ServerReflexive,///< Address discovered via STUN (public address)
58
- PeerReflexive, ///< Address discovered during connectivity checks
59
- Relay ///< TURN relay address
60
- };
61
-
62
- /**
63
- * ICE candidate transport protocol
64
- */
65
- enum class IceTransportProtocol {
66
- UDP,
67
- TCP
68
- };
69
-
70
- /**
71
- * ICE connection state
72
- */
73
- enum class IceConnectionState {
74
- New, ///< Initial state
75
- Gathering, ///< Gathering candidates
76
- Checking, ///< Performing connectivity checks
77
- Connected, ///< At least one valid pair found
78
- Completed, ///< ICE processing complete
79
- Failed, ///< ICE processing failed
80
- Disconnected, ///< Connection lost
81
- Closed ///< ICE agent closed
82
- };
83
-
84
- /**
85
- * ICE gathering state
86
- */
87
- enum class IceGatheringState {
88
- New, ///< Not started
89
- Gathering, ///< Gathering in progress
90
- Complete ///< Gathering complete
91
- };
92
-
93
- /**
94
- * ICE candidate
95
- */
96
- struct IceCandidate {
97
- IceCandidateType type;
98
- std::string foundation; ///< Unique identifier for candidate
99
- uint32_t component_id; ///< Component ID (typically 1 for RTP)
100
- IceTransportProtocol transport;
101
- uint32_t priority; ///< Candidate priority
102
- std::string address; ///< IP address
103
- uint16_t port; ///< Port number
104
- std::string related_address; ///< Related address (for srflx/relay)
105
- uint16_t related_port; ///< Related port
106
-
107
- IceCandidate() : type(IceCandidateType::Host), component_id(1),
108
- transport(IceTransportProtocol::UDP), priority(0),
109
- port(0), related_port(0) {}
110
-
111
- /**
112
- * Compute candidate priority (RFC 5245 Section 4.1.2.1)
113
- */
114
- static uint32_t compute_priority(IceCandidateType type,
115
- uint32_t local_preference = 65535,
116
- uint32_t component_id = 1);
117
-
118
- /**
119
- * Generate foundation string
120
- */
121
- static std::string generate_foundation(IceCandidateType type,
122
- const std::string& base_address,
123
- const std::string& server_address = "");
124
-
125
- /**
126
- * Format candidate as SDP attribute string (a=candidate:...)
127
- */
128
- std::string to_sdp_attribute() const;
129
-
130
- /**
131
- * Parse candidate from SDP attribute string
132
- */
133
- static std::optional<IceCandidate> from_sdp_attribute(const std::string& sdp);
134
-
135
- /**
136
- * Get candidate type as string
137
- */
138
- std::string type_string() const;
139
-
140
- /**
141
- * Get address:port string
142
- */
143
- std::string address_string() const {
144
- return address + ":" + std::to_string(port);
145
- }
146
-
147
- bool operator==(const IceCandidate& other) const {
148
- return type == other.type && address == other.address &&
149
- port == other.port && transport == other.transport;
150
- }
151
- };
152
-
153
- /**
154
- * ICE candidate pair state
155
- */
156
- enum class IceCandidatePairState {
157
- Frozen, ///< Not yet checked
158
- Waiting, ///< Waiting to be checked
159
- InProgress, ///< Check in progress
160
- Succeeded, ///< Check succeeded
161
- Failed ///< Check failed
162
- };
163
-
164
- /**
165
- * ICE candidate pair
166
- */
167
- struct IceCandidatePair {
168
- IceCandidate local;
169
- IceCandidate remote;
170
- IceCandidatePairState state;
171
- uint64_t priority; ///< Pair priority
172
- bool nominated; ///< Nominated for use
173
- int check_count; ///< Number of checks performed
174
- std::chrono::steady_clock::time_point last_check;
175
-
176
- IceCandidatePair() : state(IceCandidatePairState::Frozen),
177
- priority(0), nominated(false), check_count(0) {}
178
-
179
- /**
180
- * Compute pair priority (RFC 5245 Section 5.7.2)
181
- */
182
- static uint64_t compute_priority(uint32_t controlling_priority,
183
- uint32_t controlled_priority,
184
- bool is_controlling);
185
-
186
- /**
187
- * Get pair key for deduplication
188
- */
189
- std::string key() const {
190
- return local.address_string() + "->" + remote.address_string();
191
- }
192
- };
193
-
194
- /**
195
- * STUN/TURN server configuration
196
- */
197
- struct IceServer {
198
- std::string url; ///< Server URL (stun:host:port or turn:host:port)
199
- std::string username; ///< Username (for TURN)
200
- std::string password; ///< Password/credential (for TURN)
201
-
202
- IceServer() = default;
203
- IceServer(const std::string& u) : url(u) {}
204
- IceServer(const std::string& u, const std::string& user, const std::string& pass)
205
- : url(u), username(user), password(pass) {}
206
-
207
- /**
208
- * Check if this is a STUN server
209
- */
210
- bool is_stun() const { return url.find("stun:") == 0; }
211
-
212
- /**
213
- * Check if this is a TURN server
214
- */
215
- bool is_turn() const { return url.find("turn:") == 0 || url.find("turns:") == 0; }
216
-
217
- /**
218
- * Parse host and port from URL
219
- */
220
- bool parse_url(std::string& host, uint16_t& port) const;
221
- };
222
-
223
- /**
224
- * ICE configuration
225
- */
226
- struct IceConfig {
227
- std::vector<IceServer> ice_servers; ///< STUN/TURN servers
228
- bool gather_host_candidates = true; ///< Gather host candidates
229
- bool gather_srflx_candidates = true; ///< Gather server-reflexive candidates
230
- bool gather_relay_candidates = false; ///< Gather relay candidates (requires TURN)
231
- int gathering_timeout_ms = 5000; ///< Candidate gathering timeout
232
- int check_timeout_ms = ICE_CHECK_TIMEOUT_MS; ///< Connectivity check timeout
233
- int check_max_retries = ICE_CHECK_MAX_RETRIES; ///< Max connectivity check retries
234
- std::string software = "librats"; ///< Software attribute
235
-
236
- IceConfig() = default;
237
-
238
- /**
239
- * Add a STUN server
240
- */
241
- void add_stun_server(const std::string& host, uint16_t port = STUN_DEFAULT_PORT) {
242
- ice_servers.emplace_back("stun:" + host + ":" + std::to_string(port));
243
- }
244
-
245
- /**
246
- * Add a TURN server with credentials
247
- */
248
- void add_turn_server(const std::string& host, uint16_t port,
249
- const std::string& username, const std::string& password) {
250
- ice_servers.emplace_back("turn:" + host + ":" + std::to_string(port),
251
- username, password);
252
- }
253
- };
254
-
255
- // ============================================================================
256
- // ICE Callbacks
257
- // ============================================================================
258
-
259
- /// Callback when candidates are gathered
260
- using IceCandidatesCallback = std::function<void(const std::vector<IceCandidate>&)>;
261
-
262
- /// Callback when gathering state changes
263
- using IceGatheringStateCallback = std::function<void(IceGatheringState)>;
264
-
265
- /// Callback when connection state changes
266
- using IceConnectionStateCallback = std::function<void(IceConnectionState)>;
267
-
268
- /// Callback when a new candidate is discovered (trickle ICE)
269
- using IceNewCandidateCallback = std::function<void(const IceCandidate&)>;
270
-
271
- /// Callback when ICE completes with selected pair
272
- using IceSelectedPairCallback = std::function<void(const IceCandidatePair&)>;
273
-
274
- // ============================================================================
275
- // ICE Manager
276
- // ============================================================================
277
-
278
- /**
279
- * ICE-lite Manager for NAT traversal
280
- *
281
- * Provides:
282
- * - Candidate gathering from local interfaces, STUN, and TURN
283
- * - Connectivity checks via STUN binding requests
284
- * - Candidate pair prioritization and selection
285
- *
286
- * Example usage:
287
- * @code
288
- * IceConfig config;
289
- * config.add_stun_server("stun.l.google.com", 19302);
290
- *
291
- * IceManager ice(config);
292
- *
293
- * ice.set_on_candidates_gathered([](const std::vector<IceCandidate>& candidates) {
294
- * // Send candidates to remote peer via signaling
295
- * for (const auto& c : candidates) {
296
- * std::cout << c.to_sdp_attribute() << std::endl;
297
- * }
298
- * });
299
- *
300
- * ice.set_on_connection_state_changed([](IceConnectionState state) {
301
- * if (state == IceConnectionState::Connected) {
302
- * std::cout << "ICE connected!" << std::endl;
303
- * }
304
- * });
305
- *
306
- * // Start gathering
307
- * ice.gather_candidates();
308
- *
309
- * // Add remote candidates from signaling
310
- * ice.add_remote_candidate(remote_candidate);
311
- *
312
- * // Wait for connection
313
- * while (ice.get_connection_state() != IceConnectionState::Connected) {
314
- * std::this_thread::sleep_for(std::chrono::milliseconds(100));
315
- * }
316
- *
317
- * // Get selected pair for data transfer
318
- * auto pair = ice.get_selected_pair();
319
- * @endcode
320
- */
321
- class IceManager {
322
- public:
323
- IceManager();
324
- explicit IceManager(const IceConfig& config);
325
- ~IceManager();
326
-
327
- // Non-copyable
328
- IceManager(const IceManager&) = delete;
329
- IceManager& operator=(const IceManager&) = delete;
330
-
331
- // =========================================================================
332
- // Configuration
333
- // =========================================================================
334
-
335
- /**
336
- * Set ICE configuration
337
- */
338
- void set_config(const IceConfig& config);
339
-
340
- /**
341
- * Get current configuration
342
- */
343
- const IceConfig& config() const { return config_; }
344
-
345
- /**
346
- * Add a STUN server
347
- */
348
- void add_stun_server(const std::string& host, uint16_t port = STUN_DEFAULT_PORT);
349
-
350
- /**
351
- * Add a TURN server with credentials
352
- */
353
- void add_turn_server(const std::string& host, uint16_t port,
354
- const std::string& username, const std::string& password);
355
-
356
- /**
357
- * Clear all ICE servers
358
- */
359
- void clear_ice_servers();
360
-
361
- // =========================================================================
362
- // Candidate Gathering
363
- // =========================================================================
364
-
365
- /**
366
- * Start gathering ICE candidates
367
- * @return true if gathering started successfully
368
- */
369
- bool gather_candidates();
370
-
371
- /**
372
- * Get local candidates
373
- */
374
- std::vector<IceCandidate> get_local_candidates() const;
375
-
376
- /**
377
- * Get gathering state
378
- */
379
- IceGatheringState get_gathering_state() const { return gathering_state_; }
380
-
381
- /**
382
- * Check if gathering is complete
383
- */
384
- bool is_gathering_complete() const {
385
- return gathering_state_ == IceGatheringState::Complete;
386
- }
387
-
388
- // =========================================================================
389
- // Remote Candidates
390
- // =========================================================================
391
-
392
- /**
393
- * Add a remote candidate
394
- * @param candidate Remote candidate to add
395
- */
396
- void add_remote_candidate(const IceCandidate& candidate);
397
-
398
- /**
399
- * Add remote candidates from SDP
400
- * @param sdp_lines SDP attribute lines (a=candidate:...)
401
- */
402
- void add_remote_candidates_from_sdp(const std::vector<std::string>& sdp_lines);
403
-
404
- /**
405
- * Get remote candidates
406
- */
407
- std::vector<IceCandidate> get_remote_candidates() const;
408
-
409
- /**
410
- * Signal end of remote candidates (for trickle ICE)
411
- */
412
- void end_of_remote_candidates();
413
-
414
- // =========================================================================
415
- // Connectivity Checks
416
- // =========================================================================
417
-
418
- /**
419
- * Start connectivity checks
420
- */
421
- void start_checks();
422
-
423
- /**
424
- * Stop connectivity checks
425
- */
426
- void stop_checks();
427
-
428
- /**
429
- * Get candidate pairs
430
- */
431
- std::vector<IceCandidatePair> get_candidate_pairs() const;
432
-
433
- /**
434
- * Get the selected (best) candidate pair
435
- */
436
- std::optional<IceCandidatePair> get_selected_pair() const;
437
-
438
- // =========================================================================
439
- // Connection State
440
- // =========================================================================
441
-
442
- /**
443
- * Get connection state
444
- */
445
- IceConnectionState get_connection_state() const { return connection_state_; }
446
-
447
- /**
448
- * Check if connected
449
- */
450
- bool is_connected() const {
451
- return connection_state_ == IceConnectionState::Connected ||
452
- connection_state_ == IceConnectionState::Completed;
453
- }
454
-
455
- // =========================================================================
456
- // Public Address Discovery
457
- // =========================================================================
458
-
459
- /**
460
- * Get our public address (from server-reflexive candidate)
461
- * @return Public IP and port, or nullopt if not discovered
462
- */
463
- std::optional<std::pair<std::string, uint16_t>> get_public_address() const;
464
-
465
- // =========================================================================
466
- // Socket Access
467
- // =========================================================================
468
-
469
- /**
470
- * Get the UDP socket used for ICE
471
- * Can be used for data transfer after ICE completes
472
- */
473
- socket_t get_socket() const { return socket_; }
474
-
475
- /**
476
- * Get local port
477
- */
478
- uint16_t get_local_port() const { return local_port_; }
479
-
480
- // =========================================================================
481
- // Callbacks
482
- // =========================================================================
483
-
484
- void set_on_candidates_gathered(IceCandidatesCallback callback);
485
- void set_on_new_candidate(IceNewCandidateCallback callback);
486
- void set_on_gathering_state_changed(IceGatheringStateCallback callback);
487
- void set_on_connection_state_changed(IceConnectionStateCallback callback);
488
- void set_on_selected_pair(IceSelectedPairCallback callback);
489
-
490
- // =========================================================================
491
- // Lifecycle
492
- // =========================================================================
493
-
494
- /**
495
- * Close ICE manager and release resources
496
- */
497
- void close();
498
-
499
- /**
500
- * Restart ICE (gather new candidates and start checks)
501
- */
502
- void restart();
503
-
504
- private:
505
- // Configuration
506
- IceConfig config_;
507
-
508
- // Network
509
- socket_t socket_ = INVALID_SOCKET_VALUE;
510
- uint16_t local_port_ = 0;
511
-
512
- // STUN/TURN clients
513
- std::unique_ptr<StunClient> stun_client_;
514
- std::unique_ptr<TurnClient> turn_client_;
515
-
516
- // State
517
- mutable std::mutex mutex_;
518
- IceGatheringState gathering_state_ = IceGatheringState::New;
519
- IceConnectionState connection_state_ = IceConnectionState::New;
520
-
521
- // Candidates
522
- std::vector<IceCandidate> local_candidates_;
523
- std::vector<IceCandidate> remote_candidates_;
524
- std::vector<IceCandidatePair> candidate_pairs_;
525
- std::optional<IceCandidatePair> selected_pair_;
526
-
527
- // Flags
528
- std::atomic<bool> gathering_ {false};
529
- std::atomic<bool> checking_ {false};
530
- bool remote_candidates_complete_ = false;
531
-
532
- // Threads
533
- std::thread gathering_thread_;
534
- std::thread checking_thread_;
535
-
536
- // Callbacks
537
- IceCandidatesCallback on_candidates_gathered_;
538
- IceNewCandidateCallback on_new_candidate_;
539
- IceGatheringStateCallback on_gathering_state_changed_;
540
- IceConnectionStateCallback on_connection_state_changed_;
541
- IceSelectedPairCallback on_selected_pair_;
542
-
543
- // Internal methods
544
- bool ensure_socket();
545
- void gather_host_candidates();
546
- void gather_srflx_candidates();
547
- void gather_relay_candidates();
548
- void gathering_complete();
549
- void add_local_candidate(const IceCandidate& candidate);
550
- void form_candidate_pairs();
551
- void perform_connectivity_checks();
552
- bool perform_check(IceCandidatePair& pair);
553
- void update_connection_state();
554
- void select_best_pair();
555
- void set_gathering_state(IceGatheringState state);
556
- void set_connection_state(IceConnectionState state);
557
- };
558
-
559
- } // namespace librats