diff --git a/Cargo.lock b/Cargo.lock index fbefe8b..650c8e4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,15 +2,6 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "addr2line" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" -dependencies = [ - "gimli", -] - [[package]] name = "adler2" version = "2.0.1" @@ -158,26 +149,6 @@ dependencies = [ "syn 2.0.106", ] -[[package]] -name = "audiopus" -version = "0.3.0-rc.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab55eb0e56d7c6de3d59f544e5db122d7725ec33be6a276ee8241f3be6473955" -dependencies = [ - "audiopus_sys", -] - -[[package]] -name = "audiopus_sys" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62314a1546a2064e033665d658e88c620a62904be945f8147e6b16c3db9f8651" -dependencies = [ - "cmake", - "log", - "pkg-config", -] - [[package]] name = "autocfg" version = "1.5.0" @@ -185,18 +156,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] -name = "backtrace" -version = "0.3.75" +name = "aws-lc-rs" +version = "1.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +checksum = "faac5829c2b74c28f830747e7818ccfb684261b5f48a1118b1e2a13d36dfab13" dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets 0.52.6", + "aws-lc-sys", + "untrusted 0.7.1", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1622d8446a2d4b2ce0c7eefc73dd43a99779028d5ee5c2dd8073a658ba8a2bc" +dependencies = [ + "cc", + "cmake", + "dunce", + "fs_extra", + "pkg-config", ] [[package]] @@ -310,10 +290,13 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.33" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ee0f8803222ba5a7e2777dd72ca451868909b1ac410621b676adf07280e9b5f" +checksum = "86e055fa6e3e40ad6187ba25b6855eeb635d5271f8e0f0e1e9a5826b8d75bea0" dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", "shlex", ] @@ -363,7 +346,7 @@ dependencies = [ "iana-time-zone", "num-traits", "serde", - "windows-link", + "windows-link 0.1.3", ] [[package]] @@ -379,9 +362,9 @@ dependencies = [ [[package]] name = "circular-buffer" -version = "1.1.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23bdce1da528cadbac4654b5632bfcd8c6c63e25b1d42cea919a95958790b51d" +checksum = "662f6b21c6e889ee4e3f449e197c40f03603472fcd40c709093d386e3dca07cf" [[package]] name = "clap" @@ -499,16 +482,6 @@ dependencies = [ "unicode-segmentation", ] -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "core-foundation" version = "0.10.1" @@ -786,14 +759,16 @@ dependencies = [ [[package]] name = "denny-jack" -version = "0.1.0" +version = "0.2.0" dependencies = [ - "audiopus", + "aws-lc-rs", "circular-buffer", "clap", "config", - "error", + "hex", "log", + "opus", + "opusic-sys", "poise", "prost", "serde", @@ -802,6 +777,7 @@ dependencies = [ "tap-interface", "thiserror 2.0.15", "tokio", + "tokio-util", "tracing-subscriber", ] @@ -837,6 +813,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "derive-where" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e2b94854e8576378ccda7c8de8a66ed8b4e8acbd2c50ec3418ea6c8aaf4b567" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + [[package]] name = "derive_builder" version = "0.9.0" @@ -917,6 +904,12 @@ dependencies = [ "const-random", ] +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + [[package]] name = "ecdsa" version = "0.16.9" @@ -1038,16 +1031,6 @@ dependencies = [ "windows-sys 0.60.2", ] -[[package]] -name = "error" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6e606f14042bb87cc02ef6a14db6c90ab92ed6f62d87e69377bc759fd7987cc" -dependencies = [ - "traitobject", - "typeable", -] - [[package]] name = "error-chain" version = "0.12.4" @@ -1085,6 +1068,12 @@ version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" +[[package]] +name = "find-msvc-tools" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c66915cc5391097de7a2b0b972e8505aa33c0df401fd3a6811dbdb32881ba48" + [[package]] name = "fixedbitset" version = "0.5.7" @@ -1158,6 +1147,12 @@ dependencies = [ "hashmap_derive", ] +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + [[package]] name = "futures" version = "0.3.31" @@ -1247,15 +1242,6 @@ dependencies = [ "slab", ] -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - [[package]] name = "generator" version = "0.7.5" @@ -1331,12 +1317,6 @@ dependencies = [ "polyval", ] -[[package]] -name = "gimli" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" - [[package]] name = "glob" version = "0.3.3" @@ -1354,25 +1334,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "h2" -version = "0.3.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http 0.2.12", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - [[package]] name = "hashbrown" version = "0.14.5" @@ -1580,17 +1541,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - [[package]] name = "http" version = "1.3.1" @@ -1602,17 +1552,6 @@ dependencies = [ "itoa", ] -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http 0.2.12", - "pin-project-lite", -] - [[package]] name = "http-body" version = "1.0.1" @@ -1620,7 +1559,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.3.1", + "http", ] [[package]] @@ -1631,8 +1570,8 @@ checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", "futures-core", - "http 1.3.1", - "http-body 1.0.1", + "http", + "http-body", "pin-project-lite", ] @@ -1642,36 +1581,6 @@ version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "hyper" -version = "0.14.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http 0.2.12", - "http-body 0.4.6", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2 0.5.10", - "tokio", - "tower-service", - "tracing", - "want", -] - [[package]] name = "hyper" version = "1.6.0" @@ -1681,8 +1590,8 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.3.1", - "http-body 1.0.1", + "http", + "http-body", "httparse", "itoa", "pin-project-lite", @@ -1691,28 +1600,14 @@ dependencies = [ "want", ] -[[package]] -name = "hyper-rustls" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" -dependencies = [ - "futures-util", - "http 0.2.12", - "hyper 0.14.32", - "rustls 0.21.12", - "tokio", - "tokio-rustls 0.24.1", -] - [[package]] name = "hyper-rustls" version = "0.27.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ - "http 1.3.1", - "hyper 1.6.0", + "http", + "hyper", "hyper-util", "rustls 0.23.31", "rustls-pki-types", @@ -1733,14 +1628,14 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "http 1.3.1", - "http-body 1.0.1", - "hyper 1.6.0", + "http", + "http-body", + "hyper", "ipnet", "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.0", + "socket2 0.6.5", "tokio", "tower-service", "tracing", @@ -1921,17 +1816,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "io-uring" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" -dependencies = [ - "bitflags 2.9.2", - "cfg-if", - "libc", -] - [[package]] name = "ipnet" version = "2.11.0" @@ -1969,6 +1853,16 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +[[package]] +name = "jobserver" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" +dependencies = [ + "getrandom 0.4.2", + "libc", +] + [[package]] name = "js-sys" version = "0.3.77" @@ -2014,9 +1908,9 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libc" -version = "0.2.175" +version = "0.2.191" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" +checksum = "65cd87c9a6d60536580b316ad985726104730a5151c99845f2490428ef91240a" [[package]] name = "libcrux-aead" @@ -2351,13 +2245,13 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.4" +version = "1.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +checksum = "1788edb87fdc09c7e26304471e2f5be8cdefb1b6930d6e3985fc02ff53bf86ee" dependencies = [ "libc", "wasi", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -2473,15 +2367,6 @@ dependencies = [ "libc", ] -[[package]] -name = "object" -version = "0.36.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" -dependencies = [ - "memchr", -] - [[package]] name = "once_cell" version = "1.21.3" @@ -2586,6 +2471,15 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" +[[package]] +name = "opus" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33718946cc77d4032911d4efe03a66dbcbfbd2bb16c3da06aaeadcc637c32216" +dependencies = [ + "opusic-sys", +] + [[package]] name = "opus2" version = "0.4.0" @@ -2595,6 +2489,15 @@ dependencies = [ "libopus_sys", ] +[[package]] +name = "opusic-sys" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9d1ecdf206421bc74343ab3bb2f30ad2abbfee41fa341f7181fecbaf957769a" +dependencies = [ + "cmake", +] + [[package]] name = "ordered-float" version = "2.10.1" @@ -2870,26 +2773,28 @@ dependencies = [ [[package]] name = "poise" -version = "0.6.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1819d5a45e3590ef33754abce46432570c54a120798bdbf893112b4211fa09a6" +checksum = "2f17581b49c7da59e7eb044e55a113a75e9e933647b8616b204de5aa78fa8b7f" dependencies = [ "async-trait", - "derivative", + "derive-where", "futures-util", + "indexmap", "parking_lot 0.12.4", "poise_macros", "regex", "serenity", "tokio", "tracing", + "trim-in-place", ] [[package]] name = "poise_macros" -version = "0.6.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fa2c123c961e78315cd3deac7663177f12be4460f5440dbf62a7ed37b1effea" +checksum = "98025778ad675ec550e4ae7b65222a309575d648be4e9b0b47e3061208c9b5ad" dependencies = [ "darling 0.20.11", "proc-macro2", @@ -3333,50 +3238,6 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" -[[package]] -name = "reqwest" -version = "0.11.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" -dependencies = [ - "base64 0.21.7", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.32", - "hyper-rustls 0.24.2", - "ipnet", - "js-sys", - "log", - "mime", - "mime_guess", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls 0.21.12", - "rustls-pemfile", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 0.1.2", - "system-configuration", - "tokio", - "tokio-rustls 0.24.1", - "tokio-util", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "webpki-roots 0.25.4", - "winreg", -] - [[package]] name = "reqwest" version = "0.12.23" @@ -3387,14 +3248,15 @@ dependencies = [ "bytes", "futures-core", "futures-util", - "http 1.3.1", - "http-body 1.0.1", + "http", + "http-body", "http-body-util", - "hyper 1.6.0", - "hyper-rustls 0.27.7", + "hyper", + "hyper-rustls", "hyper-util", "js-sys", "log", + "mime_guess", "percent-encoding", "pin-project-lite", "quinn", @@ -3403,7 +3265,7 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "sync_wrapper 1.0.2", + "sync_wrapper", "tokio", "tokio-rustls 0.26.2", "tokio-util", @@ -3438,7 +3300,7 @@ dependencies = [ "cfg-if", "getrandom 0.2.16", "libc", - "untrusted", + "untrusted 0.9.0", "windows-sys 0.52.0", ] @@ -3488,12 +3350,6 @@ dependencies = [ "trim-in-place", ] -[[package]] -name = "rustc-demangle" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" - [[package]] name = "rustc-hash" version = "2.1.1" @@ -3536,18 +3392,6 @@ dependencies = [ "windows-sys 0.60.2", ] -[[package]] -name = "rustls" -version = "0.21.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" -dependencies = [ - "log", - "ring", - "rustls-webpki 0.101.7", - "sct", -] - [[package]] name = "rustls" version = "0.22.4" @@ -3588,15 +3432,6 @@ dependencies = [ "security-framework", ] -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - [[package]] name = "rustls-pki-types" version = "1.12.0" @@ -3607,16 +3442,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustls-webpki" -version = "0.101.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "rustls-webpki" version = "0.102.8" @@ -3625,7 +3450,7 @@ checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ "ring", "rustls-pki-types", - "untrusted", + "untrusted 0.9.0", ] [[package]] @@ -3636,7 +3461,7 @@ checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" dependencies = [ "ring", "rustls-pki-types", - "untrusted", + "untrusted 0.9.0", ] [[package]] @@ -3714,16 +3539,6 @@ dependencies = [ "sha2", ] -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "sec1" version = "0.7.3" @@ -3755,7 +3570,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "80fb1d92c5028aa318b4b8bd7302a5bfcf48be96a37fc6fc790f806b0004ee0c" dependencies = [ "bitflags 2.9.2", - "core-foundation 0.10.1", + "core-foundation", "core-foundation-sys", "libc", "security-framework-sys", @@ -3908,9 +3723,9 @@ dependencies = [ [[package]] name = "serenity" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d72ec4323681bf9a3cabe40fd080abc2435859b502a1b5aa9bf693f125bfa76" +checksum = "9bde37f42765dfdc34e2a039e0c84afbf79a3101c1941763b0beb816c2f17541" dependencies = [ "arrayvec", "async-trait", @@ -3921,11 +3736,11 @@ dependencies = [ "dashmap 5.5.3", "flate2", "futures", - "fxhash", "mime_guess", "parking_lot 0.12.4", "percent-encoding", - "reqwest 0.11.27", + "reqwest", + "rustc-hash", "secrecy", "serde", "serde_cow", @@ -3991,9 +3806,9 @@ dependencies = [ [[package]] name = "shlex" -version = "1.3.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" [[package]] name = "shorthand" @@ -4071,19 +3886,19 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.0" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "songbird" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b9bf4ecb5083685b79a8fc60222f12e4f036e2817c5c341cd2b9ff2b429d237" +checksum = "371362adce10df3244fbf93475ac53391aedd425482f160a9dbb3e042577de8b" dependencies = [ "aead", "aes-gcm", @@ -4106,7 +3921,7 @@ dependencies = [ "parking_lot 0.12.4", "pin-project", "rand 0.9.2", - "reqwest 0.12.23", + "reqwest", "ringbuf", "rubato", "rusty_pool", @@ -4177,7 +3992,7 @@ dependencies = [ "futures-util", "hls_m3u8", "patricia_tree", - "reqwest 0.12.23", + "reqwest", "tokio", "tracing", "url", @@ -4445,10 +4260,15 @@ dependencies = [ ] [[package]] -name = "sync_wrapper" -version = "0.1.2" +name = "syn" +version = "3.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +checksum = "d78c8dee4c7bf0e14673097256fed6142ce9d3b85a408189d07482442145823b" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] [[package]] name = "sync_wrapper" @@ -4470,27 +4290,6 @@ dependencies = [ "syn 2.0.106", ] -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "tagptr" version = "0.2.0" @@ -4659,42 +4458,29 @@ dependencies = [ [[package]] name = "tokio" -version = "1.47.1" +version = "1.54.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" +checksum = "b52fd3255258d26fac7264ab5a76b53c13367136dc011d3d6ad4f8ed070396a3" dependencies = [ - "backtrace", "bytes", - "io-uring", "libc", "mio", "pin-project-lite", "signal-hook-registry", - "slab", - "socket2 0.6.0", + "socket2 0.6.5", "tokio-macros", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "tokio-macros" -version = "2.5.0" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", -] - -[[package]] -name = "tokio-rustls" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" -dependencies = [ - "rustls 0.21.12", - "tokio", + "syn 3.0.9", ] [[package]] @@ -4752,13 +4538,14 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.16" +version = "0.7.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" +checksum = "e464cf451ba96ebfc6f9b6542f17ee8b8956e33f1e40d9690624e59d7a7f8a4b" dependencies = [ "bytes", "futures-core", "futures-sink", + "libc", "pin-project-lite", "tokio", ] @@ -4774,7 +4561,7 @@ dependencies = [ "fastrand", "futures-core", "futures-sink", - "http 1.3.1", + "http", "httparse", "ring", "rustls-native-certs", @@ -4826,7 +4613,7 @@ dependencies = [ "futures-core", "futures-util", "pin-project-lite", - "sync_wrapper 1.0.2", + "sync_wrapper", "tokio", "tower-layer", "tower-service", @@ -4841,8 +4628,8 @@ dependencies = [ "bitflags 2.9.2", "bytes", "futures-util", - "http 1.3.1", - "http-body 1.0.1", + "http", + "http-body", "iri-string", "pin-project-lite", "tower", @@ -4934,12 +4721,6 @@ dependencies = [ "tracing-log", ] -[[package]] -name = "traitobject" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04a79e25382e2e852e8da874249358d382ebaf259d0d34e75d8db16a7efabbc7" - [[package]] name = "transpose" version = "0.2.3" @@ -4977,7 +4758,7 @@ dependencies = [ "byteorder", "bytes", "data-encoding", - "http 1.3.1", + "http", "httparse", "log", "rand 0.8.5", @@ -4997,7 +4778,7 @@ checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13" dependencies = [ "bytes", "data-encoding", - "http 1.3.1", + "http", "httparse", "log", "rand 0.9.2", @@ -5051,12 +4832,6 @@ dependencies = [ "time", ] -[[package]] -name = "typeable" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887" - [[package]] name = "typeid" version = "1.0.3" @@ -5144,6 +4919,12 @@ dependencies = [ "subtle", ] +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + [[package]] name = "untrusted" version = "0.9.0" @@ -5384,12 +5165,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "webpki-roots" -version = "0.25.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" - [[package]] name = "webpki-roots" version = "0.26.11" @@ -5456,7 +5231,7 @@ checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" dependencies = [ "windows-implement", "windows-interface", - "windows-link", + "windows-link 0.1.3", "windows-result", "windows-strings", ] @@ -5489,13 +5264,19 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + [[package]] name = "windows-result" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" dependencies = [ - "windows-link", + "windows-link 0.1.3", ] [[package]] @@ -5504,16 +5285,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", + "windows-link 0.1.3", ] [[package]] @@ -5543,6 +5315,15 @@ dependencies = [ "windows-targets 0.53.3", ] +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -5580,7 +5361,7 @@ version = "0.53.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" dependencies = [ - "windows-link", + "windows-link 0.1.3", "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", "windows_i686_gnu 0.53.0", @@ -5738,16 +5519,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - [[package]] name = "wit-bindgen" version = "0.51.0" diff --git a/Cargo.toml b/Cargo.toml index d8ab16a..49f7ce0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,24 +1,27 @@ [package] name = "denny-jack" -version = "0.1.0" +version = "0.2.0" edition = "2024" [dependencies] clap = { version = "4.5.45", features = ["derive"] } config = "0.15.14" -poise = "0.6.1" +poise = "0.7.1" serde = "1.0.219" -songbird = { version = "0.6.0", features = ["builtin-queue", "driver"] } +songbird = { version = "0.6.1", features = ["builtin-queue", "driver"] } thiserror = "2.0.15" tokio = { version = "1.47.1", features = ["macros", "rt-multi-thread"] } tracing-subscriber = { version = "0.3.19", features = ["env-filter"] } -error = "0.1.9" log = "0.4.27" -audiopus = "0.3.0-rc.0" -circular-buffer = "1.1.0" +opus= { version="0.4.0" } +opusic-sys = { version = "0.7.5", features = ["bundled", "no-stack-protector", "no-hardening", "no-fortify-source"] } +circular-buffer = "2.0.1" tap-interface = {version = "0.1.0", registry = "ahines"} prost = "0.14.1" +aws-lc-rs = "1.18.2" +hex = "0.4.3" +tokio-util = "0.7.20" [dependencies.symphonia] -version = "0.5" +version = "0.5.4" features = ["aac", "mp3", "isomp4", "alac"] # ...as well as any extras you need! diff --git a/src/circular_buffer_source.rs b/src/circular_buffer_source.rs index 42603c0..56a79da 100644 --- a/src/circular_buffer_source.rs +++ b/src/circular_buffer_source.rs @@ -1,16 +1,16 @@ -use circular_buffer::CircularBuffer; +use circular_buffer::FixedCircularBuffer; use songbird::input::core::io::MediaSource; use std::io::SeekFrom; use std::{ io::{Read, Seek, Write}, - sync::{Arc, Condvar, Mutex}, + sync::{Arc, Mutex}, }; const BUFFER_SIZE: usize = 64 * 1024; #[derive(Clone, Default)] pub struct CircularBufferSource { - circular_buffer: Arc>>, + circular_buffer: Arc>>, } impl Read for CircularBufferSource { diff --git a/src/main.rs b/src/main.rs index 27b64c0..c2e5574 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,14 +7,18 @@ use crate::circular_buffer_source::CircularBufferSource; use crate::dj_config::{Args, DJConfig}; use crate::stream_task::{StreamControl, stream_task}; use crate::udp_source::UdpSource; +use aws_lc_rs::cipher::AES_256_KEY_LEN; +use aws_lc_rs::rand; use clap::Parser; use log::{error, info}; +use poise::serenity_prelude::CreateMessage; use poise::{PrefixFrameworkOptions, serenity_prelude as serenity}; use songbird::SerenityInit; use thiserror::Error; use tokio::net::UdpSocket; use tokio::sync::Mutex; use tokio::sync::mpsc::{Sender, channel}; +use tokio_util::sync::CancellationToken; use tracing_subscriber::EnvFilter; use tracing_subscriber::filter::LevelFilter; @@ -26,12 +30,17 @@ pub enum Error { FailedToJoin(#[from] songbird::error::JoinError), } +struct DennyJackControl { + pub udp_task: tokio::task::JoinHandle<()>, + pub stream_control_tx: Sender, + pub cancellation_token: CancellationToken, +} + #[allow(dead_code)] struct Data { pub config: DJConfig, - pub udp_task: tokio::task::JoinHandle<()>, pub circular_buffer_source: CircularBufferSource, - pub stream_control_tx: Mutex>>, + pub dj_control: Mutex>, } type Context<'a> = poise::Context<'a, Data, Error>; @@ -39,8 +48,8 @@ const COMMAND_QUEUE_SIZE: usize = 10; #[poise::command(slash_command, prefix_command, guild_only)] async fn join(ctx: Context<'_>) -> Result<(), Error> { - let mut stream_control_tx = match ctx.data().stream_control_tx.try_lock() { - Ok(stream_control_tx) => stream_control_tx, + let mut dj_control = match ctx.data().dj_control.try_lock() { + Ok(dj_control) => dj_control, Err(_err) => { ctx.reply("Yo yo yo, looks like someone else is streaming on the net.") .await?; @@ -67,15 +76,43 @@ async fn join(ctx: Context<'_>) -> Result<(), Error> { } }; + let mut key = vec![0; AES_256_KEY_LEN]; + rand::fill(&mut key).expect("Failed to generate key"); + + ctx.author() + .direct_message( + &ctx, + CreateMessage::new().content(format!( + "Yo Yo, your session key is `{}`.\nYou send your sweet tones to me at `{}`", + hex::encode(&key), + ctx.data().config.server_addr + )), + ) + .await?; + + let cancellation_token = CancellationToken::new(); + let udp_input = UdpSocket::bind(ctx.data().config.server_addr) + .await + .unwrap(); + let mut udp_source = UdpSource::new(udp_input, ctx.data().circular_buffer_source.clone(), &key); + + let udp_task_token = cancellation_token.clone(); + let udp_task = tokio::spawn(async move { udp_source.worker(udp_task_token).await }); + let manager = songbird::get(ctx.serenity_context()) .await - .expect("Songbird Voice client placed in at initialisation.") + .expect("Songbird Voice client placed in at initialization.") .clone(); manager.join(guild_id, connect_to).await?; let (tx, rx) = channel(COMMAND_QUEUE_SIZE); - *stream_control_tx = Some(tx); + + *dj_control = Some(DennyJackControl { + udp_task, + stream_control_tx: tx, + cancellation_token, + }); let circular_buffer_source = ctx.data().circular_buffer_source.clone(); tokio::spawn(async move { stream_task(circular_buffer_source, manager, guild_id, rx).await }); @@ -84,16 +121,16 @@ async fn join(ctx: Context<'_>) -> Result<(), Error> { } async fn send_command(ctx: Context<'_>, command: StreamControl) -> Result { - let stream_control_tx = ctx.data().stream_control_tx.lock().await; + let dj_control = ctx.data().dj_control.lock().await; - Ok(match &*stream_control_tx { + Ok(match &*dj_control { None => { ctx.reply("I can't control what doesn't exist, deep man.") .await?; false } - Some(tx) => { - tx.send(command).await.unwrap(); + Some(dj_control) => { + dj_control.stream_control_tx.send(command).await.unwrap(); true } }) @@ -119,18 +156,29 @@ async fn pause(ctx: Context<'_>) -> Result<(), Error> { #[poise::command(slash_command, prefix_command, guild_only)] async fn disconnect(ctx: Context<'_>) -> Result<(), Error> { - let mut stream_control_tx = ctx.data().stream_control_tx.lock().await; - *stream_control_tx = None; + let mut dj_control = ctx.data().dj_control.lock().await; - let manager = songbird::get(ctx.serenity_context()) - .await - .expect("Songbird Voice client placed in at initialisation.") - .clone(); + let dj_control = dj_control.take(); - manager.leave(ctx.guild_id().unwrap()).await?; + if let Some(dj_control) = dj_control { + dj_control.cancellation_token.cancel(); + if let Err(err) = dj_control.udp_task.await { + error!("Failed to join UdpSource: {err}") + } - ctx.reply("Until next time, friend DJ Denny Jack OUT!") - .await?; + let manager = songbird::get(ctx.serenity_context()) + .await + .expect("Songbird Voice client placed in at initialization.") + .clone(); + + manager.leave(ctx.guild_id().unwrap()).await?; + + ctx.reply("Until next time, friend DJ Denny Jack OUT!") + .await?; + } else { + ctx.reply("You must be confused, I'm off the air waves for the moment") + .await?; + } Ok(()) } @@ -158,24 +206,19 @@ async fn main() { let intents = serenity::GatewayIntents::non_privileged() | serenity::GatewayIntents::MESSAGE_CONTENT; - let udp_input = UdpSocket::bind(cfg.server_addr).await.unwrap(); let source = CircularBufferSource::default(); - let mut udp_source = UdpSource::new(udp_input, source.clone()); - let udp_task = tokio::spawn(async move { udp_source.worker().await }); - let data = Data { config: cfg.clone(), - udp_task, circular_buffer_source: source, - stream_control_tx: Mutex::new(None), + dj_control: Mutex::new(None), }; let framework = poise::Framework::builder() .options(poise::FrameworkOptions { commands: vec![join(), play(), pause(), disconnect()], prefix_options: PrefixFrameworkOptions { - prefix: Some("!".to_string()), + prefix: Some("!".to_string().into()), ..Default::default() }, ..Default::default() diff --git a/src/stream_task.rs b/src/stream_task.rs index 45273ae..6cea852 100644 --- a/src/stream_task.rs +++ b/src/stream_task.rs @@ -29,7 +29,7 @@ pub async fn stream_task( loop { let msg = match receiver.recv().await { None => { - info!("Stopping Stram Task..."); + info!("Stopping Stream Task..."); return; } Some(msg) => msg, diff --git a/src/udp_source.rs b/src/udp_source.rs index d41817b..804f890 100644 --- a/src/udp_source.rs +++ b/src/udp_source.rs @@ -1,14 +1,16 @@ use crate::circular_buffer_source::CircularBufferSource; -use audiopus::coder::Decoder; -use audiopus::{Channels, MutSignals, SampleRate}; -use log::{debug, error, info}; +use aws_lc_rs::aead::{AES_256_GCM, Aad, NONCE_LEN, Nonce, RandomizedNonceKey}; +use aws_lc_rs::error::Unspecified; +use log::{debug, error, info, trace}; use prost::{DecodeError, Message}; use std::io::Write; use tap_interface::tap::message::TapMessage; use thiserror::Error; use tokio::net::UdpSocket; +use tokio::select; +use tokio_util::sync::CancellationToken; -pub const SAMPLE_RATE: SampleRate = SampleRate::Hz48000; +pub const SAMPLE_RATE: u32 = 48_000; #[derive(Debug, Error)] #[allow(clippy::enum_variant_names)] @@ -16,7 +18,7 @@ pub enum Error { #[error("IO Error {0}")] IOError(#[from] std::io::Error), #[error("Failed to decode audio in packet: {0}")] - OpusError(#[from] audiopus::Error), + OpusError(#[from] opus::Error), #[error("Failed to decode packet: {0}")] DecodeError(#[from] DecodeError), } @@ -24,17 +26,19 @@ pub enum Error { pub struct UdpSource { udp: UdpSocket, source: CircularBufferSource, - decoder: Decoder, + decoder: opus::Decoder, expected_seq: u32, + key: RandomizedNonceKey, } impl UdpSource { - pub fn new(udp_socket: UdpSocket, source: CircularBufferSource) -> Self { + pub fn new(udp_socket: UdpSocket, source: CircularBufferSource, key: &[u8]) -> Self { Self { udp: udp_socket, source, - decoder: Decoder::new(SAMPLE_RATE, Channels::Stereo).unwrap(), + decoder: opus::Decoder::new(SAMPLE_RATE, opus::Channels::Stereo).unwrap(), expected_seq: 0, + key: RandomizedNonceKey::new(&AES_256_GCM, key).unwrap(), } } @@ -43,17 +47,15 @@ impl UdpSource { input_buffer: &[u8], output_buffer: &mut [f32], ) -> Result { - let packet = audiopus::packet::Packet::try_from(input_buffer)?; - - let signals = MutSignals::try_from(output_buffer)?; - - let sample_size = self.decoder.decode_float(Some(packet), signals, false)?; + let sample_size = self + .decoder + .decode_float(input_buffer, output_buffer, false)?; Ok(sample_size * 2) } fn write_audio_data_to_source(&mut self, samples: &[f32]) -> Result<(), Error> { - let mut sample_bytes = Vec::with_capacity(std::mem::size_of_val(samples)); + let mut sample_bytes = Vec::with_capacity(size_of_val(samples)); for sample in samples { let bytes = sample.to_le_bytes(); @@ -69,20 +71,46 @@ impl UdpSource { self.udp.recv(buffer).await } - pub async fn worker(&mut self) { + fn decrypt<'a>(&'a mut self, buffer: &'a mut [u8]) -> Result<&'a mut [u8], Unspecified> { + let nonce = &buffer[0..NONCE_LEN]; + let nonce = Nonce::try_assume_unique_for_key(nonce)?; + + self.key + .open_in_place(nonce, Aad::empty(), &mut buffer[NONCE_LEN..]) + } + + pub async fn worker(&mut self, cancellation_token: CancellationToken) { info!("Starting TAP UDP Endpoint"); let mut buffer = vec![0; 1024 * 32]; let mut decode_data = vec![0.0; tap_interface::STEREO_FRAME_SIZE]; loop { - let msg_size = match self.recv_message(&mut buffer).await { - Ok(msg_size) => msg_size, - Err(err) => { - error!("Failed to recv udp packet: {err:?}"); + let msg_size = select! { + res = self.recv_message(&mut buffer) => { + + + match res { + Ok(msg_size) => msg_size, + Err(err) => { + error!("Failed to recv udp packet: {err:?}"); + continue; + } + } + } + _ = cancellation_token.cancelled() => { + info!("Closing TAP UDP Endpoint..."); + return; + } + }; + + let decrypted_msg = match self.decrypt(&mut buffer[0..msg_size]) { + Ok(msg) => msg, + Err(_err) => { + trace!("Failed to decrypt message"); continue; } }; - let tap_message = match TapMessage::decode(&buffer[..msg_size]) { + let tap_message = match TapMessage::decode(&*decrypted_msg) { Ok(tap_msg) => tap_msg, Err(err) => { error!("Failed decode proto message: {err:?}");