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.
- package/README.md +145 -331
- package/binding.gyp +16 -3
- package/lib/index.d.ts +288 -696
- package/lib/index.js +407 -44
- package/native-src/3rdparty/android/ifaddrs-android.c +1 -0
- package/native-src/3rdparty/android/ifaddrs-android.h +1 -0
- package/native-src/CMakeLists.txt +404 -179
- package/native-src/LICENSE +1 -1
- package/native-src/src/librats/bindings/rats.cpp +762 -0
- package/native-src/src/librats/bindings/rats.h +380 -0
- package/native-src/src/librats/bittorrent/bencode.cpp +437 -0
- package/native-src/src/librats/bittorrent/bencode.h +176 -0
- package/native-src/src/librats/bittorrent/bitfield.cpp +97 -0
- package/native-src/src/librats/bittorrent/bitfield.h +76 -0
- package/native-src/src/librats/bittorrent/byte_io.h +58 -0
- package/native-src/src/librats/bittorrent/choker.cpp +25 -0
- package/native-src/src/librats/bittorrent/choker.h +46 -0
- package/native-src/src/librats/bittorrent/client.cpp +413 -0
- package/native-src/src/librats/bittorrent/client.h +227 -0
- package/native-src/src/librats/bittorrent/disk_io.cpp +209 -0
- package/native-src/src/librats/bittorrent/disk_io.h +150 -0
- package/native-src/src/librats/bittorrent/extensions.cpp +191 -0
- package/native-src/src/librats/bittorrent/extensions.h +94 -0
- package/native-src/src/librats/bittorrent/file_storage.cpp +77 -0
- package/native-src/src/librats/bittorrent/file_storage.h +79 -0
- package/native-src/src/librats/bittorrent/log.h +42 -0
- package/native-src/src/librats/bittorrent/magnet_uri.cpp +98 -0
- package/native-src/src/librats/bittorrent/magnet_uri.h +35 -0
- package/native-src/src/librats/bittorrent/peer_connection.cpp +502 -0
- package/native-src/src/librats/bittorrent/peer_connection.h +194 -0
- package/native-src/src/librats/bittorrent/peer_list.cpp +68 -0
- package/native-src/src/librats/bittorrent/peer_list.h +75 -0
- package/native-src/src/librats/bittorrent/piece_picker.cpp +352 -0
- package/native-src/src/librats/bittorrent/piece_picker.h +201 -0
- package/native-src/src/librats/bittorrent/reactor.cpp +97 -0
- package/native-src/src/librats/bittorrent/reactor.h +89 -0
- package/native-src/src/librats/bittorrent/resume_data.cpp +72 -0
- package/native-src/src/librats/bittorrent/resume_data.h +41 -0
- package/native-src/src/librats/bittorrent/store_buffer.cpp +48 -0
- package/native-src/src/librats/bittorrent/store_buffer.h +47 -0
- package/native-src/src/librats/bittorrent/torrent.cpp +870 -0
- package/native-src/src/librats/bittorrent/torrent.h +260 -0
- package/native-src/src/librats/bittorrent/torrent_creator.cpp +129 -0
- package/native-src/src/librats/bittorrent/torrent_creator.h +58 -0
- package/native-src/src/librats/bittorrent/torrent_info.cpp +314 -0
- package/native-src/src/librats/bittorrent/torrent_info.h +118 -0
- package/native-src/src/librats/bittorrent/tracker.cpp +374 -0
- package/native-src/src/librats/bittorrent/tracker.h +108 -0
- package/native-src/src/librats/bittorrent/types.cpp +206 -0
- package/native-src/src/librats/bittorrent/types.h +86 -0
- package/native-src/src/librats/core/address.cpp +35 -0
- package/native-src/src/librats/core/address.h +78 -0
- package/native-src/src/librats/core/bytes.h +69 -0
- package/native-src/src/librats/core/chained_send_buffer.cpp +172 -0
- package/native-src/src/librats/core/chained_send_buffer.h +183 -0
- package/native-src/src/librats/core/endpoint_parse.cpp +41 -0
- package/native-src/src/librats/core/endpoint_parse.h +31 -0
- package/native-src/src/librats/core/event_bus.h +70 -0
- package/native-src/src/librats/core/host_endpoint.h +56 -0
- package/native-src/src/{io_poller.cpp → librats/core/io_poller.cpp} +520 -65
- package/native-src/src/{io_poller.h → librats/core/io_poller.h} +12 -6
- package/native-src/src/librats/core/ip_address.cpp +120 -0
- package/native-src/src/librats/core/ip_address.h +109 -0
- package/native-src/src/librats/core/mpsc_queue.h +47 -0
- package/native-src/src/librats/core/notifier.h +74 -0
- package/native-src/src/librats/core/receive_buffer.cpp +219 -0
- package/native-src/src/librats/core/receive_buffer.h +171 -0
- package/native-src/src/librats/core/service_registry.h +58 -0
- package/native-src/src/{socket.cpp → librats/core/socket.cpp} +625 -118
- package/native-src/src/librats/core/socket.h +496 -0
- package/native-src/src/librats/core/timer_queue.h +105 -0
- package/native-src/src/librats/core/types.cpp +43 -0
- package/native-src/src/librats/core/types.h +103 -0
- package/native-src/src/librats/core/wakeup_pipe.h +83 -0
- package/native-src/src/{crypto → librats/crypto}/blake2_endian.h +21 -23
- package/native-src/src/{crypto → librats/crypto}/blake2b.c +34 -33
- package/native-src/src/{crypto → librats/crypto}/blake2b.h +7 -6
- package/native-src/src/{crypto → librats/crypto}/blake2s.c +55 -54
- package/native-src/src/{crypto → librats/crypto}/blake2s.h +13 -12
- package/native-src/src/{crypto → librats/crypto}/chacha.c +22 -21
- package/native-src/src/{crypto → librats/crypto}/chacha.h +14 -13
- package/native-src/src/{crypto → librats/crypto}/chachapoly.c +56 -56
- package/native-src/src/{crypto → librats/crypto}/chachapoly.h +24 -17
- package/native-src/src/{crc32.cpp → librats/crypto/crc32.cpp} +1 -1
- package/native-src/src/{crc32.h → librats/crypto/crc32.h} +3 -1
- package/native-src/src/{crypto → librats/crypto}/curve25519.c +6 -4
- package/native-src/src/{crypto → librats/crypto}/curve25519.h +6 -3
- package/native-src/src/librats/crypto/hkdf.c +266 -0
- package/native-src/src/{crypto → librats/crypto}/hkdf.h +19 -19
- package/native-src/src/{noise.cpp → librats/crypto/noise.cpp} +84 -73
- package/native-src/src/{noise.h → librats/crypto/noise.h} +18 -8
- package/native-src/src/{crypto → librats/crypto}/poly1305.c +47 -46
- package/native-src/src/librats/crypto/poly1305.h +37 -0
- package/native-src/src/{sha1.cpp → librats/crypto/sha1.cpp} +33 -1
- package/native-src/src/{sha1.h → librats/crypto/sha1.h} +14 -6
- package/native-src/src/{crypto → librats/crypto}/sha256.c +15 -14
- package/native-src/src/{crypto → librats/crypto}/sha256.h +8 -7
- package/native-src/src/{crypto → librats/crypto}/sha512.c +15 -14
- package/native-src/src/{crypto → librats/crypto}/sha512.h +8 -7
- package/native-src/src/librats/dht/announce.cpp +37 -0
- package/native-src/src/librats/dht/announce.h +41 -0
- package/native-src/src/librats/dht/bep42.cpp +109 -0
- package/native-src/src/librats/dht/bep42.h +48 -0
- package/native-src/src/librats/dht/dht.cpp +501 -0
- package/native-src/src/librats/dht/dht.h +119 -0
- package/native-src/src/librats/dht/dht_runner.cpp +103 -0
- package/native-src/src/librats/dht/dht_runner.h +71 -0
- package/native-src/src/librats/dht/dos_blocker.cpp +42 -0
- package/native-src/src/librats/dht/dos_blocker.h +47 -0
- package/native-src/src/librats/dht/find_peers.cpp +52 -0
- package/native-src/src/librats/dht/find_peers.h +73 -0
- package/native-src/src/librats/dht/id.h +167 -0
- package/native-src/src/{krpc.cpp → librats/dht/krpc.cpp} +32 -81
- package/native-src/src/{krpc.h → librats/dht/krpc.h} +19 -23
- package/native-src/src/librats/dht/log.h +38 -0
- package/native-src/src/librats/dht/node.cpp +473 -0
- package/native-src/src/librats/dht/node.h +164 -0
- package/native-src/src/librats/dht/node_entry.h +81 -0
- package/native-src/src/librats/dht/observer.h +72 -0
- package/native-src/src/librats/dht/persistence.cpp +90 -0
- package/native-src/src/librats/dht/persistence.h +32 -0
- package/native-src/src/librats/dht/routing_table.cpp +559 -0
- package/native-src/src/librats/dht/routing_table.h +185 -0
- package/native-src/src/librats/dht/rpc_manager.cpp +127 -0
- package/native-src/src/librats/dht/rpc_manager.h +77 -0
- package/native-src/src/librats/dht/storage.cpp +92 -0
- package/native-src/src/librats/dht/storage.h +74 -0
- package/native-src/src/librats/dht/transport.h +27 -0
- package/native-src/src/librats/dht/traversal.cpp +326 -0
- package/native-src/src/librats/dht/traversal.h +120 -0
- package/native-src/src/librats/dht/udp_transport.cpp +49 -0
- package/native-src/src/librats/dht/udp_transport.h +51 -0
- package/native-src/src/librats/mdns/log.h +22 -0
- package/native-src/src/{mdns.cpp → librats/mdns/mdns.cpp} +75 -40
- package/native-src/src/{mdns.h → librats/mdns/mdns.h} +9 -8
- package/native-src/src/{natpmp.cpp → librats/nat/natpmp.cpp} +12 -9
- package/native-src/src/{natpmp.h → librats/nat/natpmp.h} +3 -3
- package/native-src/src/{port_mapping.h → librats/nat/port_mapping.h} +3 -2
- package/native-src/src/{stun.cpp → librats/nat/stun.cpp} +4 -4
- package/native-src/src/{stun.h → librats/nat/stun.h} +1 -1
- package/native-src/src/{upnp.cpp → librats/nat/upnp.cpp} +6 -6
- package/native-src/src/{upnp.h → librats/nat/upnp.h} +2 -2
- package/native-src/src/librats/node/circuit_service.h +84 -0
- package/native-src/src/librats/node/config.h +110 -0
- package/native-src/src/librats/node/dial_service.h +54 -0
- package/native-src/src/librats/node/dialer.cpp +264 -0
- package/native-src/src/librats/node/dialer.h +188 -0
- package/native-src/src/librats/node/host_events.h +26 -0
- package/native-src/src/librats/node/identify.cpp +130 -0
- package/native-src/src/librats/node/identify.h +71 -0
- package/native-src/src/librats/node/nat_status.cpp +103 -0
- package/native-src/src/librats/node/nat_status.h +118 -0
- package/native-src/src/librats/node/node.cpp +865 -0
- package/native-src/src/librats/node/node.h +344 -0
- package/native-src/src/librats/node/node_context.h +33 -0
- package/native-src/src/librats/node/peer_network.h +91 -0
- package/native-src/src/librats/peer/peer.h +49 -0
- package/native-src/src/librats/peer/peer_book.cpp +181 -0
- package/native-src/src/librats/peer/peer_book.h +88 -0
- package/native-src/src/librats/peer/peer_id.cpp +72 -0
- package/native-src/src/librats/peer/peer_id.h +62 -0
- package/native-src/src/librats/peer/peer_info.h +37 -0
- package/native-src/src/librats/peer/peer_table.cpp +170 -0
- package/native-src/src/librats/peer/peer_table.h +148 -0
- package/native-src/src/librats/security/handshaker.h +66 -0
- package/native-src/src/librats/security/identity.h +43 -0
- package/native-src/src/librats/security/noise_security.cpp +122 -0
- package/native-src/src/librats/security/noise_security.h +37 -0
- package/native-src/src/librats/security/plaintext_security.h +106 -0
- package/native-src/src/librats/security/session.h +37 -0
- package/native-src/src/{storage.cpp → librats/storage/storage.cpp} +369 -522
- package/native-src/src/{storage.h → librats/storage/storage.h} +135 -299
- package/native-src/src/librats/subsystems/bittorrent.cpp +211 -0
- package/native-src/src/librats/subsystems/bittorrent.h +136 -0
- package/native-src/src/librats/subsystems/dht_discovery.cpp +202 -0
- package/native-src/src/librats/subsystems/dht_discovery.h +123 -0
- package/native-src/src/librats/subsystems/dht_service.h +36 -0
- package/native-src/src/librats/subsystems/file_transfer.cpp +972 -0
- package/native-src/src/librats/subsystems/file_transfer.h +367 -0
- package/native-src/src/librats/subsystems/hole_punch.cpp +605 -0
- package/native-src/src/librats/subsystems/hole_punch.h +290 -0
- package/native-src/src/librats/subsystems/hole_punch_service.h +38 -0
- package/native-src/src/librats/subsystems/mdns_discovery.cpp +66 -0
- package/native-src/src/librats/subsystems/mdns_discovery.h +55 -0
- package/native-src/src/librats/subsystems/message_json.cpp +112 -0
- package/native-src/src/librats/subsystems/message_json.h +88 -0
- package/native-src/src/librats/subsystems/peer_exchange.cpp +241 -0
- package/native-src/src/librats/subsystems/peer_exchange.h +136 -0
- package/native-src/src/librats/subsystems/ping_service.cpp +98 -0
- package/native-src/src/librats/subsystems/ping_service.h +66 -0
- package/native-src/src/librats/subsystems/port_mapping_service.cpp +192 -0
- package/native-src/src/librats/subsystems/port_mapping_service.h +84 -0
- package/native-src/src/librats/subsystems/pubsub.cpp +567 -0
- package/native-src/src/librats/subsystems/pubsub.h +175 -0
- package/native-src/src/librats/subsystems/reconnection.cpp +239 -0
- package/native-src/src/librats/subsystems/reconnection.h +126 -0
- package/native-src/src/librats/subsystems/relay.cpp +1142 -0
- package/native-src/src/librats/subsystems/relay.h +211 -0
- package/native-src/src/librats/subsystems/relay_service.h +46 -0
- package/native-src/src/librats/transport/connection.cpp +343 -0
- package/native-src/src/librats/transport/connection.h +283 -0
- package/native-src/src/librats/transport/link.h +96 -0
- package/native-src/src/librats/transport/reactor.cpp +588 -0
- package/native-src/src/librats/transport/reactor.h +262 -0
- package/native-src/src/librats/transport/reactor_pool.h +81 -0
- package/native-src/src/librats/transport/relay_link.cpp +208 -0
- package/native-src/src/librats/transport/relay_link.h +303 -0
- package/native-src/src/librats/transport/tcp_link.cpp +49 -0
- package/native-src/src/librats/transport/tcp_link.h +43 -0
- package/native-src/src/librats/transport/udp_mux.cpp +617 -0
- package/native-src/src/librats/transport/udp_mux.h +363 -0
- package/native-src/src/librats/transport/udp_packet.cpp +121 -0
- package/native-src/src/librats/transport/udp_packet.h +190 -0
- package/native-src/src/librats/transport/udp_stream.cpp +1194 -0
- package/native-src/src/librats/transport/udp_stream.h +614 -0
- package/native-src/src/librats/util/features.h.in +51 -0
- package/native-src/src/{fs.cpp → librats/util/fs.cpp} +51 -3
- package/native-src/src/librats/util/fs.h +136 -0
- package/native-src/src/librats/util/json.cpp +1002 -0
- package/native-src/src/librats/util/json.h +444 -0
- package/native-src/src/{logger.cpp → librats/util/logger.cpp} +1 -1
- package/native-src/src/{logger.h → librats/util/logger.h} +43 -31
- package/native-src/src/{network_monitor.cpp → librats/util/network_monitor.cpp} +12 -4
- package/native-src/src/{network_monitor.h → librats/util/network_monitor.h} +2 -1
- package/native-src/src/{network_utils.cpp → librats/util/network_utils.cpp} +38 -23
- package/native-src/src/{network_utils.h → librats/util/network_utils.h} +15 -8
- package/native-src/src/{os.cpp → librats/util/os.cpp} +48 -18
- package/native-src/src/librats/util/rats_export.h +69 -0
- package/native-src/src/{version.cpp → librats/util/version.cpp} +2 -2
- package/native-src/src/{version.h.in → librats/util/version.h.in} +1 -1
- package/native-src/src/librats/wire/frame.cpp +76 -0
- package/native-src/src/librats/wire/frame.h +111 -0
- package/native-src/src/librats/wire/message_router.cpp +45 -0
- package/native-src/src/librats/wire/message_router.h +47 -0
- package/package.json +5 -4
- package/scripts/build-librats.js +1 -0
- package/scripts/postinstall.js +3 -3
- package/scripts/prepare-package.js +4 -4
- package/scripts/verify-installation.js +63 -105
- package/src/librats_node.cpp +1067 -1323
- package/native-src/src/bencode.cpp +0 -485
- package/native-src/src/bencode.h +0 -145
- package/native-src/src/bittorrent.cpp +0 -14
- package/native-src/src/bittorrent.h +0 -74
- package/native-src/src/bt_bitfield.cpp +0 -372
- package/native-src/src/bt_bitfield.h +0 -316
- package/native-src/src/bt_choker.cpp +0 -228
- package/native-src/src/bt_choker.h +0 -147
- package/native-src/src/bt_client.cpp +0 -1047
- package/native-src/src/bt_client.h +0 -445
- package/native-src/src/bt_create_torrent.cpp +0 -677
- package/native-src/src/bt_create_torrent.h +0 -473
- package/native-src/src/bt_extension.cpp +0 -469
- package/native-src/src/bt_extension.h +0 -309
- package/native-src/src/bt_file_storage.cpp +0 -261
- package/native-src/src/bt_file_storage.h +0 -298
- package/native-src/src/bt_handshake.cpp +0 -134
- package/native-src/src/bt_handshake.h +0 -157
- package/native-src/src/bt_messages.cpp +0 -364
- package/native-src/src/bt_messages.h +0 -324
- package/native-src/src/bt_network.cpp +0 -1007
- package/native-src/src/bt_network.h +0 -417
- package/native-src/src/bt_peer_connection.cpp +0 -742
- package/native-src/src/bt_peer_connection.h +0 -592
- package/native-src/src/bt_piece_picker.cpp +0 -786
- package/native-src/src/bt_piece_picker.h +0 -473
- package/native-src/src/bt_resume_data.cpp +0 -410
- package/native-src/src/bt_resume_data.h +0 -249
- package/native-src/src/bt_torrent.cpp +0 -2120
- package/native-src/src/bt_torrent.h +0 -641
- package/native-src/src/bt_torrent_info.cpp +0 -659
- package/native-src/src/bt_torrent_info.h +0 -418
- package/native-src/src/bt_types.h +0 -621
- package/native-src/src/chained_send_buffer.cpp +0 -75
- package/native-src/src/chained_send_buffer.h +0 -137
- package/native-src/src/crypto/hkdf.c +0 -266
- package/native-src/src/crypto/poly1305.h +0 -36
- package/native-src/src/dht.cpp +0 -3311
- package/native-src/src/dht.h +0 -717
- package/native-src/src/disk_io.cpp +0 -632
- package/native-src/src/disk_io.h +0 -315
- package/native-src/src/file_transfer.cpp +0 -1415
- package/native-src/src/file_transfer.h +0 -286
- package/native-src/src/fs.h +0 -108
- package/native-src/src/gossipsub.cpp +0 -1139
- package/native-src/src/gossipsub.h +0 -403
- package/native-src/src/ice.cpp +0 -893
- package/native-src/src/ice.h +0 -559
- package/native-src/src/json.hpp +0 -25526
- package/native-src/src/librats.cpp +0 -2378
- package/native-src/src/librats.h +0 -2324
- package/native-src/src/librats_bittorrent.cpp +0 -601
- package/native-src/src/librats_c.cpp +0 -1557
- package/native-src/src/librats_c.h +0 -323
- package/native-src/src/librats_discovery.cpp +0 -402
- package/native-src/src/librats_encryption.cpp +0 -275
- package/native-src/src/librats_file_transfer.cpp +0 -144
- package/native-src/src/librats_gossipsub.cpp +0 -289
- package/native-src/src/librats_ice.cpp +0 -213
- package/native-src/src/librats_log_macros.h +0 -36
- package/native-src/src/librats_logging.cpp +0 -173
- package/native-src/src/librats_mdns.cpp +0 -166
- package/native-src/src/librats_persistence.cpp +0 -796
- package/native-src/src/librats_portmap.cpp +0 -419
- package/native-src/src/librats_reconnection.cpp +0 -218
- package/native-src/src/librats_statistic.cpp +0 -105
- package/native-src/src/librats_storage.cpp +0 -189
- package/native-src/src/rats_export.h +0 -17
- package/native-src/src/receive_buffer.cpp +0 -82
- package/native-src/src/receive_buffer.h +0 -127
- package/native-src/src/socket.h +0 -228
- package/native-src/src/threadmanager.cpp +0 -105
- package/native-src/src/threadmanager.h +0 -53
- package/native-src/src/tracker.cpp +0 -1264
- package/native-src/src/tracker.h +0 -319
- package/native-src/src/turn.cpp +0 -762
- package/native-src/src/turn.h +0 -460
- package/native-src/src/wakeup_pipe.h +0 -60
- /package/native-src/src/{os.h → librats/util/os.h} +0 -0
package/native-src/src/ice.h
DELETED
|
@@ -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
|