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,485 +0,0 @@
1
- #include "bencode.h"
2
- #include <stdexcept>
3
- #include <sstream>
4
- #include <algorithm>
5
- #include <cstdint>
6
-
7
- namespace librats {
8
-
9
- // BencodeValue implementation
10
- BencodeValue::BencodeValue() : type_(Type::String), value_(std::string()) {}
11
-
12
- BencodeValue::BencodeValue(int64_t value) : type_(Type::Integer), value_(value) {}
13
-
14
- BencodeValue::BencodeValue(const std::string& value) : type_(Type::String), value_(value) {}
15
-
16
- BencodeValue::BencodeValue(const char* value) : type_(Type::String), value_(std::string(value)) {}
17
-
18
- #if LIBRATS_USE_SHARED_PTR_VARIANT
19
- BencodeValue::BencodeValue(const BencodeList& value) : type_(Type::List), value_(std::make_shared<BencodeList>(value)) {}
20
- #else
21
- BencodeValue::BencodeValue(const BencodeList& value) : type_(Type::List), value_(value) {}
22
- #endif
23
-
24
- #if LIBRATS_USE_SHARED_PTR_VARIANT
25
- BencodeValue::BencodeValue(const BencodeDict& value) : type_(Type::Dictionary), value_(std::make_shared<BencodeDict>(value)) {}
26
- #else
27
- BencodeValue::BencodeValue(const BencodeDict& value) : type_(Type::Dictionary), value_(value) {}
28
- #endif
29
-
30
- BencodeValue::BencodeValue(const BencodeValue& other) : type_(other.type_), value_(other.value_) {}
31
-
32
- BencodeValue::BencodeValue(BencodeValue&& other) noexcept : type_(other.type_), value_(std::move(other.value_)) {}
33
-
34
- BencodeValue& BencodeValue::operator=(const BencodeValue& other) {
35
- if (this != &other) {
36
- type_ = other.type_;
37
- value_ = other.value_;
38
- }
39
- return *this;
40
- }
41
-
42
- BencodeValue& BencodeValue::operator=(BencodeValue&& other) noexcept {
43
- if (this != &other) {
44
- type_ = other.type_;
45
- value_ = std::move(other.value_);
46
- }
47
- return *this;
48
- }
49
-
50
- BencodeValue::~BencodeValue() = default;
51
-
52
- int64_t BencodeValue::as_integer() const {
53
- if (type_ != Type::Integer) {
54
- throw std::runtime_error("BencodeValue is not an integer");
55
- }
56
- return std::get<int64_t>(value_);
57
- }
58
-
59
- const std::string& BencodeValue::as_string() const {
60
- if (type_ != Type::String) {
61
- throw std::runtime_error("BencodeValue is not a string");
62
- }
63
- return std::get<std::string>(value_);
64
- }
65
-
66
- const BencodeList& BencodeValue::as_list() const {
67
- if (type_ != Type::List) {
68
- throw std::runtime_error("BencodeValue is not a list");
69
- }
70
- #if LIBRATS_USE_SHARED_PTR_VARIANT
71
- return *std::get<std::shared_ptr<BencodeList>>(value_);
72
- #else
73
- return std::get<BencodeList>(value_);
74
- #endif
75
- }
76
-
77
- const BencodeDict& BencodeValue::as_dict() const {
78
- if (type_ != Type::Dictionary) {
79
- throw std::runtime_error("BencodeValue is not a dictionary");
80
- }
81
- #if LIBRATS_USE_SHARED_PTR_VARIANT
82
- return *std::get<std::shared_ptr<BencodeDict>>(value_);
83
- #else
84
- return std::get<BencodeDict>(value_);
85
- #endif
86
- }
87
-
88
- BencodeList& BencodeValue::as_list() {
89
- if (type_ != Type::List) {
90
- throw std::runtime_error("BencodeValue is not a list");
91
- }
92
- #if LIBRATS_USE_SHARED_PTR_VARIANT
93
- return *std::get<std::shared_ptr<BencodeList>>(value_);
94
- #else
95
- return std::get<BencodeList>(value_);
96
- #endif
97
- }
98
-
99
- BencodeDict& BencodeValue::as_dict() {
100
- if (type_ != Type::Dictionary) {
101
- throw std::runtime_error("BencodeValue is not a dictionary");
102
- }
103
- #if LIBRATS_USE_SHARED_PTR_VARIANT
104
- return *std::get<std::shared_ptr<BencodeDict>>(value_);
105
- #else
106
- return std::get<BencodeDict>(value_);
107
- #endif
108
- }
109
-
110
- bool BencodeValue::has_key(const std::string& key) const {
111
- if (type_ != Type::Dictionary) {
112
- return false;
113
- }
114
- #if LIBRATS_USE_SHARED_PTR_VARIANT
115
- const auto& dict = *std::get<std::shared_ptr<BencodeDict>>(value_);
116
- #else
117
- const auto& dict = std::get<BencodeDict>(value_);
118
- #endif
119
- return dict.find(key) != dict.end();
120
- }
121
-
122
- const BencodeValue& BencodeValue::operator[](const std::string& key) const {
123
- if (type_ != Type::Dictionary) {
124
- throw std::runtime_error("BencodeValue is not a dictionary");
125
- }
126
- #if LIBRATS_USE_SHARED_PTR_VARIANT
127
- const auto& dict = *std::get<std::shared_ptr<BencodeDict>>(value_);
128
- #else
129
- const auto& dict = std::get<BencodeDict>(value_);
130
- #endif
131
- auto it = dict.find(key);
132
- if (it == dict.end()) {
133
- throw std::runtime_error("Key not found in dictionary: " + key);
134
- }
135
- return it->second;
136
- }
137
-
138
- BencodeValue& BencodeValue::operator[](const std::string& key) {
139
- if (type_ != Type::Dictionary) {
140
- throw std::runtime_error("BencodeValue is not a dictionary");
141
- }
142
- #if LIBRATS_USE_SHARED_PTR_VARIANT
143
- auto& dict = *std::get<std::shared_ptr<BencodeDict>>(value_);
144
- #else
145
- auto& dict = std::get<BencodeDict>(value_);
146
- #endif
147
- return dict[key];
148
- }
149
-
150
- const BencodeValue& BencodeValue::operator[](size_t index) const {
151
- if (type_ != Type::List) {
152
- throw std::runtime_error("BencodeValue is not a list");
153
- }
154
- #if LIBRATS_USE_SHARED_PTR_VARIANT
155
- const auto& list = *std::get<std::shared_ptr<BencodeList>>(value_);
156
- #else
157
- const auto& list = std::get<BencodeList>(value_);
158
- #endif
159
- if (index >= list.size()) {
160
- throw std::runtime_error("Index out of bounds");
161
- }
162
- return list[index];
163
- }
164
-
165
- BencodeValue& BencodeValue::operator[](size_t index) {
166
- if (type_ != Type::List) {
167
- throw std::runtime_error("BencodeValue is not a list");
168
- }
169
- #if LIBRATS_USE_SHARED_PTR_VARIANT
170
- auto& list = *std::get<std::shared_ptr<BencodeList>>(value_);
171
- #else
172
- auto& list = std::get<BencodeList>(value_);
173
- #endif
174
- if (index >= list.size()) {
175
- throw std::runtime_error("Index out of bounds");
176
- }
177
- return list[index];
178
- }
179
-
180
- void BencodeValue::push_back(const BencodeValue& value) {
181
- if (type_ != Type::List) {
182
- throw std::runtime_error("BencodeValue is not a list");
183
- }
184
- #if LIBRATS_USE_SHARED_PTR_VARIANT
185
- auto& list = *std::get<std::shared_ptr<BencodeList>>(value_);
186
- #else
187
- auto& list = std::get<BencodeList>(value_);
188
- #endif
189
- list.push_back(value);
190
- }
191
-
192
- size_t BencodeValue::size() const {
193
- switch (type_) {
194
- case Type::String:
195
- return std::get<std::string>(value_).size();
196
- case Type::List:
197
- #if LIBRATS_USE_SHARED_PTR_VARIANT
198
- return std::get<std::shared_ptr<BencodeList>>(value_)->size();
199
- #else
200
- return std::get<BencodeList>(value_).size();
201
- #endif
202
- case Type::Dictionary:
203
- #if LIBRATS_USE_SHARED_PTR_VARIANT
204
- return std::get<std::shared_ptr<BencodeDict>>(value_)->size();
205
- #else
206
- return std::get<BencodeDict>(value_).size();
207
- #endif
208
- default:
209
- throw std::runtime_error("Size not applicable to this type");
210
- }
211
- }
212
-
213
- std::vector<uint8_t> BencodeValue::encode() const {
214
- std::vector<uint8_t> buffer;
215
- encode_to_buffer(buffer);
216
- return buffer;
217
- }
218
-
219
- std::string BencodeValue::encode_string() const {
220
- auto buffer = encode();
221
- return std::string(buffer.begin(), buffer.end());
222
- }
223
-
224
- void BencodeValue::encode_to_buffer(std::vector<uint8_t>& buffer) const {
225
- switch (type_) {
226
- case Type::Integer: {
227
- std::string str = "i" + std::to_string(std::get<int64_t>(value_)) + "e";
228
- buffer.insert(buffer.end(), str.begin(), str.end());
229
- break;
230
- }
231
- case Type::String: {
232
- const auto& str = std::get<std::string>(value_);
233
- std::string len_str = std::to_string(str.size()) + ":";
234
- buffer.insert(buffer.end(), len_str.begin(), len_str.end());
235
- buffer.insert(buffer.end(), str.begin(), str.end());
236
- break;
237
- }
238
- case Type::List: {
239
- buffer.push_back('l');
240
- #if LIBRATS_USE_SHARED_PTR_VARIANT
241
- const auto& list = *std::get<std::shared_ptr<BencodeList>>(value_);
242
- #else
243
- const auto& list = std::get<BencodeList>(value_);
244
- #endif
245
- for (const auto& item : list) {
246
- item.encode_to_buffer(buffer);
247
- }
248
- buffer.push_back('e');
249
- break;
250
- }
251
- case Type::Dictionary: {
252
- buffer.push_back('d');
253
- #if LIBRATS_USE_SHARED_PTR_VARIANT
254
- const auto& dict = *std::get<std::shared_ptr<BencodeDict>>(value_);
255
- #else
256
- const auto& dict = std::get<BencodeDict>(value_);
257
- #endif
258
-
259
- // Sort keys for consistent encoding
260
- std::vector<std::string> keys;
261
- for (const auto& pair : dict) {
262
- keys.push_back(pair.first);
263
- }
264
- std::sort(keys.begin(), keys.end());
265
-
266
- for (const auto& key : keys) {
267
- // Encode key
268
- std::string len_str = std::to_string(key.size()) + ":";
269
- buffer.insert(buffer.end(), len_str.begin(), len_str.end());
270
- buffer.insert(buffer.end(), key.begin(), key.end());
271
-
272
- // Encode value
273
- dict.at(key).encode_to_buffer(buffer);
274
- }
275
- buffer.push_back('e');
276
- break;
277
- }
278
- }
279
- }
280
-
281
- BencodeValue BencodeValue::create_integer(int64_t value) {
282
- return BencodeValue(value);
283
- }
284
-
285
- BencodeValue BencodeValue::create_string(const std::string& value) {
286
- return BencodeValue(value);
287
- }
288
-
289
- BencodeValue BencodeValue::create_list() {
290
- BencodeValue result;
291
- result.type_ = Type::List;
292
- #if LIBRATS_USE_SHARED_PTR_VARIANT
293
- result.value_ = std::make_shared<BencodeList>();
294
- #else
295
- result.value_ = BencodeList();
296
- #endif
297
- return result;
298
- }
299
-
300
- BencodeValue BencodeValue::create_dict() {
301
- BencodeValue result;
302
- result.type_ = Type::Dictionary;
303
- #if LIBRATS_USE_SHARED_PTR_VARIANT
304
- result.value_ = std::make_shared<BencodeDict>();
305
- #else
306
- result.value_ = BencodeDict();
307
- #endif
308
- return result;
309
- }
310
-
311
- // BencodeDecoder implementation
312
- BencodeDecoder::BencodeDecoder(const uint8_t* data, size_t size) : data_(data), size_(size), pos_(0) {}
313
-
314
- BencodeValue BencodeDecoder::decode(const std::vector<uint8_t>& data) {
315
- return decode(data.data(), data.size());
316
- }
317
-
318
- BencodeValue BencodeDecoder::decode(const std::string& data) {
319
- return decode(reinterpret_cast<const uint8_t*>(data.data()), data.size());
320
- }
321
-
322
- BencodeValue BencodeDecoder::decode(const uint8_t* data, size_t size) {
323
- BencodeDecoder decoder(data, size);
324
- return decoder.decode_value();
325
- }
326
-
327
- BencodeValue BencodeDecoder::decode_value() {
328
- if (!has_more()) {
329
- throw std::runtime_error("Unexpected end of data");
330
- }
331
-
332
- uint8_t first_byte = current_byte();
333
-
334
- if (first_byte == 'i') {
335
- return decode_integer();
336
- } else if (first_byte == 'l') {
337
- return decode_list();
338
- } else if (first_byte == 'd') {
339
- return decode_dict();
340
- } else if (first_byte >= '0' && first_byte <= '9') {
341
- return decode_string();
342
- } else {
343
- throw std::runtime_error("Invalid bencode data");
344
- }
345
- }
346
-
347
- BencodeValue BencodeDecoder::decode_integer() {
348
- if (consume_byte() != 'i') {
349
- throw std::runtime_error("Expected 'i' for integer");
350
- }
351
-
352
- std::string num_str;
353
- while (has_more() && current_byte() != 'e') {
354
- num_str += consume_byte();
355
- }
356
-
357
- if (!has_more() || consume_byte() != 'e') {
358
- throw std::runtime_error("Expected 'e' to end integer");
359
- }
360
-
361
- if (num_str.empty()) {
362
- throw std::runtime_error("Empty integer");
363
- }
364
-
365
- try {
366
- return BencodeValue(std::stoll(num_str));
367
- } catch (const std::exception&) {
368
- throw std::runtime_error("Invalid integer: " + num_str);
369
- }
370
- }
371
-
372
- BencodeValue BencodeDecoder::decode_string() {
373
- std::string len_str;
374
- while (has_more() && current_byte() != ':') {
375
- len_str += consume_byte();
376
- }
377
-
378
- if (!has_more() || consume_byte() != ':') {
379
- throw std::runtime_error("Expected ':' in string");
380
- }
381
-
382
- if (len_str.empty()) {
383
- throw std::runtime_error("Empty string length");
384
- }
385
-
386
- size_t length;
387
- try {
388
- length = std::stoull(len_str);
389
- } catch (const std::exception&) {
390
- throw std::runtime_error("Invalid string length: " + len_str);
391
- }
392
-
393
- if (pos_ + length > size_) {
394
- throw std::runtime_error("String length exceeds data size");
395
- }
396
-
397
- std::string str = consume_string(length);
398
- return BencodeValue(str);
399
- }
400
-
401
- BencodeValue BencodeDecoder::decode_list() {
402
- if (consume_byte() != 'l') {
403
- throw std::runtime_error("Expected 'l' for list");
404
- }
405
-
406
- BencodeValue list = BencodeValue::create_list();
407
-
408
- while (has_more() && current_byte() != 'e') {
409
- list.push_back(decode_value());
410
- }
411
-
412
- if (!has_more() || consume_byte() != 'e') {
413
- throw std::runtime_error("Expected 'e' to end list");
414
- }
415
-
416
- return list;
417
- }
418
-
419
- BencodeValue BencodeDecoder::decode_dict() {
420
- if (consume_byte() != 'd') {
421
- throw std::runtime_error("Expected 'd' for dictionary");
422
- }
423
-
424
- BencodeValue dict = BencodeValue::create_dict();
425
-
426
- while (has_more() && current_byte() != 'e') {
427
- // Decode key (must be string)
428
- BencodeValue key = decode_string();
429
-
430
- // Decode value
431
- BencodeValue value = decode_value();
432
-
433
- dict[key.as_string()] = value;
434
- }
435
-
436
- if (!has_more() || consume_byte() != 'e') {
437
- throw std::runtime_error("Expected 'e' to end dictionary");
438
- }
439
-
440
- return dict;
441
- }
442
-
443
- uint8_t BencodeDecoder::current_byte() const {
444
- if (pos_ >= size_) {
445
- throw std::runtime_error("Unexpected end of data");
446
- }
447
- return data_[pos_];
448
- }
449
-
450
- uint8_t BencodeDecoder::consume_byte() {
451
- if (pos_ >= size_) {
452
- throw std::runtime_error("Unexpected end of data");
453
- }
454
- return data_[pos_++];
455
- }
456
-
457
- std::string BencodeDecoder::consume_string(size_t length) {
458
- if (pos_ + length > size_) {
459
- throw std::runtime_error("String length exceeds data size");
460
- }
461
- std::string str(reinterpret_cast<const char*>(data_ + pos_), length);
462
- pos_ += length;
463
- return str;
464
- }
465
-
466
- // Utility functions
467
- namespace bencode {
468
- BencodeValue decode(const std::vector<uint8_t>& data) {
469
- return BencodeDecoder::decode(data);
470
- }
471
-
472
- BencodeValue decode(const std::string& data) {
473
- return BencodeDecoder::decode(data);
474
- }
475
-
476
- std::vector<uint8_t> encode(const BencodeValue& value) {
477
- return value.encode();
478
- }
479
-
480
- std::string encode_string(const BencodeValue& value) {
481
- return value.encode_string();
482
- }
483
- }
484
-
485
- } // namespace librats
@@ -1,145 +0,0 @@
1
- #pragma once
2
-
3
- #include <vector>
4
- #include <string>
5
- #include <unordered_map>
6
- #include <memory>
7
- #include <variant>
8
- #include <cstdint>
9
-
10
- // Use shared_ptr variant for GCC 11 and lower compatibility
11
- #ifndef LIBRATS_USE_SHARED_PTR_VARIANT
12
- #if defined(__GNUC__) && (__GNUC__ <= 11)
13
- #define LIBRATS_USE_SHARED_PTR_VARIANT 1
14
- #else
15
- #define LIBRATS_USE_SHARED_PTR_VARIANT 0
16
- #endif
17
- #endif
18
-
19
- namespace librats {
20
-
21
- // Forward declarations
22
- class BencodeValue;
23
- using BencodeDict = std::unordered_map<std::string, BencodeValue>;
24
- using BencodeList = std::vector<BencodeValue>;
25
-
26
- /**
27
- * Represents a bencoded value which can be:
28
- * - Integer (signed 64-bit)
29
- * - String (byte string)
30
- * - List (array of bencoded values)
31
- * - Dictionary (map of string keys to bencoded values)
32
- */
33
- class BencodeValue {
34
- public:
35
- enum class Type {
36
- Integer,
37
- String,
38
- List,
39
- Dictionary
40
- };
41
-
42
- // Constructors
43
- BencodeValue();
44
- BencodeValue(int64_t value);
45
- BencodeValue(const std::string& value);
46
- BencodeValue(const char* value);
47
- BencodeValue(const BencodeList& value);
48
- BencodeValue(const BencodeDict& value);
49
-
50
- // Copy and move constructors
51
- BencodeValue(const BencodeValue& other);
52
- BencodeValue(BencodeValue&& other) noexcept;
53
- BencodeValue& operator=(const BencodeValue& other);
54
- BencodeValue& operator=(BencodeValue&& other) noexcept;
55
-
56
- ~BencodeValue();
57
-
58
- // Type checking
59
- Type get_type() const { return type_; }
60
- bool is_integer() const { return type_ == Type::Integer; }
61
- bool is_string() const { return type_ == Type::String; }
62
- bool is_list() const { return type_ == Type::List; }
63
- bool is_dict() const { return type_ == Type::Dictionary; }
64
-
65
- // Value access
66
- int64_t as_integer() const;
67
- const std::string& as_string() const;
68
- const BencodeList& as_list() const;
69
- const BencodeDict& as_dict() const;
70
-
71
- // Mutable access
72
- BencodeList& as_list();
73
- BencodeDict& as_dict();
74
-
75
- // Dictionary operations
76
- bool has_key(const std::string& key) const;
77
- const BencodeValue& operator[](const std::string& key) const;
78
- BencodeValue& operator[](const std::string& key);
79
-
80
- // List operations
81
- const BencodeValue& operator[](size_t index) const;
82
- BencodeValue& operator[](size_t index);
83
- void push_back(const BencodeValue& value);
84
- size_t size() const;
85
-
86
- // Encoding
87
- std::vector<uint8_t> encode() const;
88
- std::string encode_string() const;
89
-
90
- // Static creation methods
91
- static BencodeValue create_integer(int64_t value);
92
- static BencodeValue create_string(const std::string& value);
93
- static BencodeValue create_list();
94
- static BencodeValue create_dict();
95
-
96
- private:
97
- Type type_;
98
- #if LIBRATS_USE_SHARED_PTR_VARIANT
99
- std::variant<int64_t, std::string, std::shared_ptr<BencodeList>, std::shared_ptr<BencodeDict>> value_;
100
- #else
101
- std::variant<int64_t, std::string, BencodeList, BencodeDict> value_;
102
- #endif
103
-
104
- void encode_to_buffer(std::vector<uint8_t>& buffer) const;
105
- };
106
-
107
- /**
108
- * Bencode decoder
109
- */
110
- class BencodeDecoder {
111
- public:
112
- static BencodeValue decode(const std::vector<uint8_t>& data);
113
- static BencodeValue decode(const std::string& data);
114
- static BencodeValue decode(const uint8_t* data, size_t size);
115
-
116
- private:
117
- const uint8_t* data_;
118
- size_t size_;
119
- size_t pos_;
120
-
121
- BencodeDecoder(const uint8_t* data, size_t size);
122
-
123
- BencodeValue decode_value();
124
- BencodeValue decode_integer();
125
- BencodeValue decode_string();
126
- BencodeValue decode_list();
127
- BencodeValue decode_dict();
128
-
129
- bool has_more() const { return pos_ < size_; }
130
- uint8_t current_byte() const;
131
- uint8_t consume_byte();
132
- std::string consume_string(size_t length);
133
- };
134
-
135
- /**
136
- * Utility functions
137
- */
138
- namespace bencode {
139
- BencodeValue decode(const std::vector<uint8_t>& data);
140
- BencodeValue decode(const std::string& data);
141
- std::vector<uint8_t> encode(const BencodeValue& value);
142
- std::string encode_string(const BencodeValue& value);
143
- }
144
-
145
- } // namespace librats
@@ -1,14 +0,0 @@
1
- /**
2
- * @file bittorrent.cpp
3
- * @brief BitTorrent module entry point
4
- *
5
- * This file can be used for any module-level initialization
6
- * that doesn't belong to a specific component.
7
- */
8
-
9
- #ifdef RATS_SEARCH_FEATURES
10
-
11
- // All BitTorrent components are implemented in their respective bt_*.cpp files
12
- // This file exists for module-level code if needed
13
-
14
- #endif // RATS_SEARCH_FEATURES