feat: event-driven UI updates for instant channel switching (#15)
* chore: regenerate Cargo.lock after rebase * fix(ui): add 1s cool-down to prevent double-tap channel join voiceJoin returns instantly (fire-and-forget protocol), so the pending-join guard clears before a second tap lands. The cool-down prevents the rapid channel oscillation and ClientIsFlooding (524) that results from double-tapping. * fix(ui): handle ChannelAlreadyIn as success, ClientIsFlooding with backoff - ChannelAlreadyIn (0x0302): treat as silent success, update UI state - ClientIsFlooding (0x020c): show localized snackbar, extend cooldown 5s - Add l10n strings for flooding error (en + zh) * fix(proto): use Windows TS3 client version for broadest compatibility Matches Qint's default (Windows_3_X_X__1). Avoids server-side behavioral differences with TS5 version strings. * fix(proto): patch tsproto-types to handle short P-256 coordinates BigInt::to_bytes_be() strips leading zeros, causing WrongPublicKeyLength when a server's ephemeral key coordinate starts with 0x00. Patch from EdisonJwa/tsclientlib fix/p256-short-coordinate-pad branch left-pads coordinates to the P-256 field size instead of rejecting them. * refactor(core): stop watchdog from emitting SnapshotChanged The watchdog now serves only as a liveness probe (miss counting for reconnection). UI updates are handled entirely by the event-driven delta path (ProtocolDelta → SessionEvent → BridgeEvent → Flutter). Removes signature tracking and SnapshotChanged emission from the supervisor loop. The initial snapshot is still fetched via the Connected event handler in Flutter. * refactor(ui): remove channel-join cooldown guard With event-driven deltas the UI updates instantly on channel moves, so the 1-second cooldown is no longer needed. Double-taps are handled by the server (ChannelAlreadyIn → success) and the pending-channel-id guard prevents overlapping requests. Also removes the _lastJoinCompletedAt field entirely. * fix(core): reattach event forwarders after reconnect The reconnect path swapped in a new ProtocolClient but never took chat_rx, activity_rx, or delta_rx from it. After the first reconnect, the event-driven UI pipeline was dead. Fix by extracting spawn_event_forwarders() helper called on both initial connect and reconnect. Also replaces lossy try_recv+sleep polling with proper recv().await for push-based delivery. * feat(protocol): enrich delta schema with all snapshot-visible fields ClientJoined now carries input_muted, output_muted, is_server_query, talk_power, talk_power_granted. ChannelAdded/ChannelUpdated now carry has_password and needed_talk_power. ClientUpdated also carries is_server_query, talk_power, talk_power_granted. This prevents local snapshot drift where fabricated defaults could hide password requirements, talk-power restrictions, or client type. * refactor: remove dead SnapshotChanged variant end-to-end SnapshotChanged is no longer emitted since the watchdog was refactored to liveness-only. Removes the variant from SessionEvent, BridgeEvent, and the Flutter switch statement. FRB bindings regenerated. * fix(ci): regenerate license inventory and fix iOS submodule fetch - Regenerate docs/security/license-inventory.md to match current lockfile - Remove submodules: true from checkout (causes hard fail on private submodule) - Add explicit git submodule update --init --depth=1 with || true fallback - Check silero-coreml/Package.swift instead of directory existence
This commit is contained in:
Generated
+83
-70
@@ -77,7 +77,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "812947049edcd670a82cd5c73c3661d2e58468577ba8489de58e1a73c04cbd5d"
|
||||
dependencies = [
|
||||
"alsa-sys",
|
||||
"bitflags 2.11.1",
|
||||
"bitflags 2.12.1",
|
||||
"cfg-if",
|
||||
"libc",
|
||||
]
|
||||
@@ -274,9 +274,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "2.11.1"
|
||||
version = "2.12.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3"
|
||||
checksum = "84d7ced0ae9557296835c32bf1b1e02b44c746701f898460fb000d7eaa84f00a"
|
||||
dependencies = [
|
||||
"serde_core",
|
||||
]
|
||||
@@ -351,9 +351,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.2.62"
|
||||
version = "1.2.63"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98"
|
||||
checksum = "556e016178bb5662a08681bbe0f00f8e17631781a4dfc8c45e466e4b185ec27f"
|
||||
dependencies = [
|
||||
"find-msvc-tools",
|
||||
"jobserver",
|
||||
@@ -507,7 +507,7 @@ dependencies = [
|
||||
"base64",
|
||||
"chanora_resolver",
|
||||
"futures",
|
||||
"reqwest 0.13.3",
|
||||
"reqwest 0.13.4",
|
||||
"serde",
|
||||
"thiserror 2.0.18",
|
||||
"time",
|
||||
@@ -705,7 +705,7 @@ version = "0.14.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7d5d7dca3ebcf65a035582c9ad4385371a9d9ee6537474d2a278f4e1e475bb58"
|
||||
dependencies = [
|
||||
"bitflags 2.11.1",
|
||||
"bitflags 2.12.1",
|
||||
"libc",
|
||||
"objc2-audio-toolbox",
|
||||
"objc2-core-audio",
|
||||
@@ -1070,7 +1070,7 @@ version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38"
|
||||
dependencies = [
|
||||
"bitflags 2.11.1",
|
||||
"bitflags 2.12.1",
|
||||
"block2",
|
||||
"libc",
|
||||
"objc2",
|
||||
@@ -1078,9 +1078,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "displaydoc"
|
||||
version = "0.2.5"
|
||||
version = "0.2.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
|
||||
checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -1711,9 +1711,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "http"
|
||||
version = "1.4.0"
|
||||
version = "1.4.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a"
|
||||
checksum = "8be7462df143984c4598a256ef469b251d7d7f9e271135073e78fc535414f3d0"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"itoa",
|
||||
@@ -1750,9 +1750,9 @@ checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
|
||||
|
||||
[[package]]
|
||||
name = "hyper"
|
||||
version = "1.9.0"
|
||||
version = "1.10.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca"
|
||||
checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498"
|
||||
dependencies = [
|
||||
"atomic-waker",
|
||||
"bytes",
|
||||
@@ -2177,7 +2177,7 @@ version = "0.2.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "83270a18e9f90d0707c41e9f35efada77b64c0e6f3f1810e71c8368a864d5590"
|
||||
dependencies = [
|
||||
"bitflags 2.11.1",
|
||||
"bitflags 2.12.1",
|
||||
"libc",
|
||||
]
|
||||
|
||||
@@ -2204,9 +2204,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "log"
|
||||
version = "0.4.29"
|
||||
version = "0.4.31"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
|
||||
checksum = "113b30b4cd05f7c06868fdb2854f66a7b9fece9a48425351cd532e810d74024f"
|
||||
|
||||
[[package]]
|
||||
name = "lru-slab"
|
||||
@@ -2254,9 +2254,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "memchr"
|
||||
version = "2.8.0"
|
||||
version = "2.8.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79"
|
||||
checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8"
|
||||
|
||||
[[package]]
|
||||
name = "memoffset"
|
||||
@@ -2296,9 +2296,9 @@ checksum = "c505b3e17ed6b70a7ed2e67fbb2c560ee327353556120d6e72f5232b6880d536"
|
||||
|
||||
[[package]]
|
||||
name = "mio"
|
||||
version = "1.2.0"
|
||||
version = "1.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1"
|
||||
checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"wasi",
|
||||
@@ -2360,7 +2360,7 @@ version = "0.9.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4"
|
||||
dependencies = [
|
||||
"bitflags 2.11.1",
|
||||
"bitflags 2.12.1",
|
||||
"jni-sys 0.3.1",
|
||||
"log",
|
||||
"ndk-sys",
|
||||
@@ -2503,7 +2503,7 @@ version = "0.3.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6948501a91121d6399b79abaa33a8aa4ea7857fe019f341b8c23ad6e81b79b08"
|
||||
dependencies = [
|
||||
"bitflags 2.11.1",
|
||||
"bitflags 2.12.1",
|
||||
"libc",
|
||||
"objc2",
|
||||
"objc2-core-audio",
|
||||
@@ -2541,7 +2541,7 @@ version = "0.3.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5a89f2ec274a0cf4a32642b2991e8b351a404d290da87bb6a9a9d8632490bd1c"
|
||||
dependencies = [
|
||||
"bitflags 2.11.1",
|
||||
"bitflags 2.12.1",
|
||||
"objc2",
|
||||
]
|
||||
|
||||
@@ -2551,7 +2551,7 @@ version = "0.3.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536"
|
||||
dependencies = [
|
||||
"bitflags 2.11.1",
|
||||
"bitflags 2.12.1",
|
||||
"block2",
|
||||
"dispatch2",
|
||||
"libc",
|
||||
@@ -2570,7 +2570,7 @@ version = "0.3.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272"
|
||||
dependencies = [
|
||||
"bitflags 2.11.1",
|
||||
"bitflags 2.12.1",
|
||||
"block2",
|
||||
"libc",
|
||||
"objc2",
|
||||
@@ -2641,7 +2641,7 @@ version = "0.10.80"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a45fa2aa886c42762255da344f0a0d313e254066c46aad76f300c3d3da62d967"
|
||||
dependencies = [
|
||||
"bitflags 2.11.1",
|
||||
"bitflags 2.12.1",
|
||||
"cfg-if",
|
||||
"foreign-types",
|
||||
"libc",
|
||||
@@ -3133,7 +3133,7 @@ version = "0.5.18"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d"
|
||||
dependencies = [
|
||||
"bitflags 2.11.1",
|
||||
"bitflags 2.12.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -3225,9 +3225,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "reqwest"
|
||||
version = "0.13.3"
|
||||
version = "0.13.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "62e0021ea2c22aed41653bc7e1419abb2c97e038ff2c33d0e1309e49a97deec0"
|
||||
checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3"
|
||||
dependencies = [
|
||||
"base64",
|
||||
"bytes",
|
||||
@@ -3300,7 +3300,7 @@ version = "0.32.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7753b721174eb8ff87a9a0e799e2d7bc3749323e773db92e0984debb00019d6e"
|
||||
dependencies = [
|
||||
"bitflags 2.11.1",
|
||||
"bitflags 2.12.1",
|
||||
"fallible-iterator",
|
||||
"fallible-streaming-iterator",
|
||||
"hashlink",
|
||||
@@ -3355,7 +3355,7 @@ version = "1.1.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190"
|
||||
dependencies = [
|
||||
"bitflags 2.11.1",
|
||||
"bitflags 2.12.1",
|
||||
"errno",
|
||||
"libc",
|
||||
"linux-raw-sys",
|
||||
@@ -3379,9 +3379,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rustls-native-certs"
|
||||
version = "0.8.3"
|
||||
version = "0.8.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63"
|
||||
checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d"
|
||||
dependencies = [
|
||||
"openssl-probe",
|
||||
"rustls-pki-types",
|
||||
@@ -3517,7 +3517,7 @@ version = "2.11.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02"
|
||||
dependencies = [
|
||||
"bitflags 2.11.1",
|
||||
"bitflags 2.12.1",
|
||||
"core-foundation 0.9.4",
|
||||
"core-foundation-sys",
|
||||
"libc",
|
||||
@@ -3530,7 +3530,7 @@ version = "3.7.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d"
|
||||
dependencies = [
|
||||
"bitflags 2.11.1",
|
||||
"bitflags 2.12.1",
|
||||
"core-foundation 0.10.1",
|
||||
"core-foundation-sys",
|
||||
"libc",
|
||||
@@ -3667,9 +3667,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 = "signal-hook-registry"
|
||||
@@ -3733,9 +3733,9 @@ checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
|
||||
|
||||
[[package]]
|
||||
name = "socket2"
|
||||
version = "0.6.3"
|
||||
version = "0.6.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e"
|
||||
checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"windows-sys 0.61.2",
|
||||
@@ -3885,7 +3885,7 @@ version = "0.7.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b"
|
||||
dependencies = [
|
||||
"bitflags 2.11.1",
|
||||
"bitflags 2.12.1",
|
||||
"core-foundation 0.9.4",
|
||||
"system-configuration-sys",
|
||||
]
|
||||
@@ -4159,9 +4159,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "toml_edit"
|
||||
version = "0.25.11+spec-1.1.0"
|
||||
version = "0.25.12+spec-1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b"
|
||||
checksum = "d2153edc6955a6c354fad8f5efd38b6a8769bdccf9fe50f8e1329f81b0baa5d7"
|
||||
dependencies = [
|
||||
"indexmap",
|
||||
"toml_datetime",
|
||||
@@ -4205,7 +4205,7 @@ version = "0.6.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840"
|
||||
dependencies = [
|
||||
"bitflags 2.11.1",
|
||||
"bitflags 2.12.1",
|
||||
"bytes",
|
||||
"futures-util",
|
||||
"http",
|
||||
@@ -4333,7 +4333,7 @@ dependencies = [
|
||||
"time",
|
||||
"tracing",
|
||||
"tsproto-packets",
|
||||
"tsproto-structs",
|
||||
"tsproto-structs 0.2.0 (git+https://github.com/ReSpeak/tsclientlib.git?rev=04aa2491)",
|
||||
"tsproto-types",
|
||||
]
|
||||
|
||||
@@ -4352,7 +4352,7 @@ dependencies = [
|
||||
"num-traits",
|
||||
"pin-utils",
|
||||
"rand 0.10.1",
|
||||
"reqwest 0.13.3",
|
||||
"reqwest 0.13.4",
|
||||
"thiserror 2.0.18",
|
||||
"time",
|
||||
"tokio",
|
||||
@@ -4401,7 +4401,7 @@ version = "0.1.0"
|
||||
source = "git+https://github.com/ReSpeak/tsclientlib.git?rev=04aa2491#04aa24917abbf6a0c8442a79742d6d2d40ecf71e"
|
||||
dependencies = [
|
||||
"base64",
|
||||
"bitflags 2.11.1",
|
||||
"bitflags 2.12.1",
|
||||
"num-derive",
|
||||
"num-traits",
|
||||
"omnom",
|
||||
@@ -4410,6 +4410,19 @@ dependencies = [
|
||||
"thiserror 2.0.18",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tsproto-structs"
|
||||
version = "0.2.0"
|
||||
source = "git+https://github.com/EdisonJwa/tsclientlib.git?branch=fix%2Fp256-short-coordinate-pad#8b7a3226c692319b714ea1d32fd5ded05911aa40"
|
||||
dependencies = [
|
||||
"base64",
|
||||
"csv",
|
||||
"heck",
|
||||
"once_cell",
|
||||
"serde",
|
||||
"toml",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tsproto-structs"
|
||||
version = "0.2.0"
|
||||
@@ -4426,10 +4439,10 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "tsproto-types"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/ReSpeak/tsclientlib.git?rev=04aa2491#04aa24917abbf6a0c8442a79742d6d2d40ecf71e"
|
||||
source = "git+https://github.com/EdisonJwa/tsclientlib.git?branch=fix%2Fp256-short-coordinate-pad#8b7a3226c692319b714ea1d32fd5ded05911aa40"
|
||||
dependencies = [
|
||||
"base64",
|
||||
"bitflags 2.11.1",
|
||||
"bitflags 2.12.1",
|
||||
"curve25519-dalek-ng",
|
||||
"elliptic-curve",
|
||||
"generic-array",
|
||||
@@ -4446,14 +4459,14 @@ dependencies = [
|
||||
"t4rust-derive",
|
||||
"thiserror 2.0.18",
|
||||
"time",
|
||||
"tsproto-structs",
|
||||
"tsproto-structs 0.2.0 (git+https://github.com/EdisonJwa/tsclientlib.git?branch=fix%2Fp256-short-coordinate-pad)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "typenum"
|
||||
version = "1.20.0"
|
||||
version = "1.20.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de"
|
||||
checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20"
|
||||
|
||||
[[package]]
|
||||
name = "uds_windows"
|
||||
@@ -4514,9 +4527,9 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
|
||||
|
||||
[[package]]
|
||||
name = "uuid"
|
||||
version = "1.23.1"
|
||||
version = "1.23.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76"
|
||||
checksum = "d258b83ceec21034727ecee8c382cfa6c3e133699b0742c64571814fb420c9f7"
|
||||
dependencies = [
|
||||
"getrandom 0.4.2",
|
||||
"js-sys",
|
||||
@@ -4674,7 +4687,7 @@ version = "0.244.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe"
|
||||
dependencies = [
|
||||
"bitflags 2.11.1",
|
||||
"bitflags 2.12.1",
|
||||
"hashbrown 0.15.5",
|
||||
"indexmap",
|
||||
"semver",
|
||||
@@ -5187,7 +5200,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"bitflags 2.11.1",
|
||||
"bitflags 2.12.1",
|
||||
"indexmap",
|
||||
"log",
|
||||
"serde",
|
||||
@@ -5248,9 +5261,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "zbus"
|
||||
version = "5.15.0"
|
||||
version = "5.16.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c3bcbf15c8708d7fc1be0c993622e0a5cbd5e8b52bfa40afa4c3e0cd8d724ac1"
|
||||
checksum = "eee682d202a77e4a9f3b2c2bdf48a7b28af5c08c34ddf66f98c93e5e39464285"
|
||||
dependencies = [
|
||||
"async-broadcast",
|
||||
"async-recursion",
|
||||
@@ -5278,9 +5291,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "zbus_macros"
|
||||
version = "5.15.0"
|
||||
version = "5.16.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "51fa5406ad9175a8c825a931f8cf347116b531b3634fcb0b627c290f1f2516ff"
|
||||
checksum = "adf1bd45a81a103745b1757754762a26e8cd01e4532e4d6c8ec431624b80d1d6"
|
||||
dependencies = [
|
||||
"proc-macro-crate",
|
||||
"proc-macro2",
|
||||
@@ -5304,18 +5317,18 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy"
|
||||
version = "0.8.48"
|
||||
version = "0.8.50"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9"
|
||||
checksum = "3b065d4f0e55f82fae73202e189638116a87c55ab6b8e6c2721e13dd9d854ad1"
|
||||
dependencies = [
|
||||
"zerocopy-derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy-derive"
|
||||
version = "0.8.48"
|
||||
version = "0.8.50"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4"
|
||||
checksum = "0b631b19d36a892ab55420c92dbc83ccd79274f25be714855d3074aa71cab639"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -5404,9 +5417,9 @@ checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
|
||||
|
||||
[[package]]
|
||||
name = "zvariant"
|
||||
version = "5.11.0"
|
||||
version = "5.12.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1c1567a6ec68df868cbbfde844cfc6d81649fe5109a62b116b19fabd53e618ee"
|
||||
checksum = "a192a0bde63360d77a7523c833d4b4ce6070a927e2c53246e4c540b1a3e27be0"
|
||||
dependencies = [
|
||||
"endi",
|
||||
"enumflags2",
|
||||
@@ -5418,9 +5431,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "zvariant_derive"
|
||||
version = "5.11.0"
|
||||
version = "5.12.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c7d5b780599bbde114e39d9a0799577fad1ced5105d38515745f7b3099d8ceda"
|
||||
checksum = "90bc6cde9c01c511074be97f7ccb6c19d0da89e3f8662e812e999dcfd4638737"
|
||||
dependencies = [
|
||||
"proc-macro-crate",
|
||||
"proc-macro2",
|
||||
@@ -5431,9 +5444,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "zvariant_utils"
|
||||
version = "3.3.1"
|
||||
version = "3.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6d464f5733ffa07a3164d656f18533caace9d0638596721355d73256a410d691"
|
||||
checksum = "1e8535915cfa75547e559d8c68e8139909a4aeee076831e4ef7fc59d8172c4d6"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
|
||||
@@ -71,5 +71,14 @@ serde = { version = "1", features = ["derive"] }
|
||||
# pr2502/cmake-rs as of 2026-05-18) so the patch is reproducible.
|
||||
# Re-evaluate and remove once PR #257 merges and a fresh `cmake`
|
||||
# release lands on crates.io (current upstream is 0.7.2).
|
||||
# Patch tsproto-types to left-pad P-256 coordinates that are shorter than
|
||||
# 32 bytes. BigInt::to_bytes_be() strips leading zero bytes; when a
|
||||
# coordinate happens to start with 0x00 (~0.8 % probability per coordinate)
|
||||
# the upstream code rejects it with WrongPublicKeyLength, breaking the
|
||||
# init-server handshake. The fix zero-pads to the field size instead.
|
||||
# Fork: https://github.com/EdisonJwa/tsclientlib/tree/fix/p256-short-coordinate-pad
|
||||
[patch."https://github.com/ReSpeak/tsclientlib.git"]
|
||||
tsproto-types = { git = "https://github.com/EdisonJwa/tsclientlib.git", branch = "fix/p256-short-coordinate-pad" }
|
||||
|
||||
[patch.crates-io]
|
||||
cmake = { git = "https://github.com/pr2502/cmake-rs", rev = "bdad5edc569d82151922c5c6c4685b1563f12aa1" }
|
||||
|
||||
@@ -29,6 +29,7 @@ import 'services/ts3_server_link.dart';
|
||||
import 'services/ui_preferences_service.dart';
|
||||
import 'src/rust/api.dart' as rust;
|
||||
import 'src/rust/frb_generated.dart';
|
||||
import 'src/rust/lib.dart' as rust_err;
|
||||
import 'widgets/permission_state_banner.dart';
|
||||
import 'widgets/audio_processing_config_state.dart';
|
||||
import 'widgets/chat_views.dart';
|
||||
@@ -648,13 +649,6 @@ class _BetaHomeState extends State<_BetaHome> with WidgetsBindingObserver {
|
||||
case rust.BridgeEvent_AudioStopped():
|
||||
_statsTimer?.cancel();
|
||||
_statsTimer = null;
|
||||
case rust.BridgeEvent_SnapshotChanged():
|
||||
setState(() {
|
||||
if (_phase == ConnectionPhase.synchronizing) {
|
||||
_phase = ConnectionPhase.connected;
|
||||
}
|
||||
});
|
||||
unawaited(_refreshSnapshot(recordActivity: true, reportErrors: true));
|
||||
case rust.BridgeEvent_PttCapability(
|
||||
:final level,
|
||||
:final backendId,
|
||||
@@ -690,7 +684,6 @@ class _BetaHomeState extends State<_BetaHome> with WidgetsBindingObserver {
|
||||
});
|
||||
if (inChannel) {
|
||||
_ensureStatsTimer();
|
||||
unawaited(_onRefresh());
|
||||
} else {
|
||||
_statsTimer?.cancel();
|
||||
_statsTimer = null;
|
||||
@@ -800,6 +793,72 @@ class _BetaHomeState extends State<_BetaHome> with WidgetsBindingObserver {
|
||||
});
|
||||
case rust.BridgeEvent_AudioRouteChanged():
|
||||
break;
|
||||
case rust.BridgeEvent_ClientMoved(:final clientId, :final newChannelId):
|
||||
_applyClientDelta((c) => c.id == clientId, (c) {
|
||||
final updated = rust.BridgeClient(
|
||||
id: c.id,
|
||||
channel: newChannelId,
|
||||
name: c.name,
|
||||
inputMuted: c.inputMuted,
|
||||
outputMuted: c.outputMuted,
|
||||
isSpeaking: c.isSpeaking,
|
||||
isServerQuery: c.isServerQuery,
|
||||
talkPower: c.talkPower,
|
||||
talkPowerGranted: c.talkPowerGranted,
|
||||
);
|
||||
return updated;
|
||||
});
|
||||
case rust.BridgeEvent_ClientJoined(:final clientId, :final channelId, :final name, :final inputMuted, :final outputMuted, :final isServerQuery, :final talkPower, :final talkPowerGranted):
|
||||
_applyClientAdd(rust.BridgeClient(
|
||||
id: clientId,
|
||||
channel: channelId,
|
||||
name: name,
|
||||
inputMuted: inputMuted,
|
||||
outputMuted: outputMuted,
|
||||
isSpeaking: false,
|
||||
isServerQuery: isServerQuery,
|
||||
talkPower: talkPower,
|
||||
talkPowerGranted: talkPowerGranted,
|
||||
));
|
||||
case rust.BridgeEvent_ClientLeft(:final clientId):
|
||||
_applyClientRemove(clientId);
|
||||
case rust.BridgeEvent_ClientUpdated(:final clientId, :final inputMuted, :final outputMuted, :final isServerQuery, :final talkPower, :final talkPowerGranted):
|
||||
_applyClientDelta((c) => c.id == clientId, (c) {
|
||||
final updated = rust.BridgeClient(
|
||||
id: c.id,
|
||||
channel: c.channel,
|
||||
name: c.name,
|
||||
inputMuted: inputMuted,
|
||||
outputMuted: outputMuted,
|
||||
isSpeaking: c.isSpeaking,
|
||||
isServerQuery: isServerQuery,
|
||||
talkPower: talkPower,
|
||||
talkPowerGranted: talkPowerGranted,
|
||||
);
|
||||
return updated;
|
||||
});
|
||||
case rust.BridgeEvent_ChannelAdded(:final id, :final parent, :final name, :final order, :final hasPassword, :final neededTalkPower):
|
||||
_applyChannelAdd(rust.BridgeChannel(
|
||||
id: id,
|
||||
parent: parent,
|
||||
name: name,
|
||||
order: order,
|
||||
hasPassword: hasPassword,
|
||||
neededTalkPower: neededTalkPower,
|
||||
));
|
||||
case rust.BridgeEvent_ChannelRemoved(:final id):
|
||||
_applyChannelRemove(id);
|
||||
case rust.BridgeEvent_ChannelUpdated(:final id, :final name, :final hasPassword, :final neededTalkPower):
|
||||
_applyChannelDelta((ch) => ch.id == id, (ch) {
|
||||
return rust.BridgeChannel(
|
||||
id: ch.id,
|
||||
parent: ch.parent,
|
||||
name: name,
|
||||
order: ch.order,
|
||||
hasPassword: hasPassword,
|
||||
neededTalkPower: neededTalkPower,
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1093,15 +1152,31 @@ class _BetaHomeState extends State<_BetaHome> with WidgetsBindingObserver {
|
||||
_canJoinVoiceChannel = true;
|
||||
_voiceStateInitialized = true;
|
||||
});
|
||||
unawaited(_onRefresh());
|
||||
} catch (e) {
|
||||
if (!mounted) return;
|
||||
// Surface as a SnackBar so the user sees it even while
|
||||
// connected. The message is selected by TS3 error code per
|
||||
// the canonical catalogue at
|
||||
// https://github.com/ReSpeak/tsdeclarations.
|
||||
if (_isAlreadyInChannel(e)) {
|
||||
setState(() {
|
||||
_currentVoiceChannelId = ch.id;
|
||||
_pendingVoiceChannelId = null;
|
||||
_inChannel = true;
|
||||
});
|
||||
return;
|
||||
}
|
||||
if (_isFlooding(e)) {
|
||||
setState(() {
|
||||
_pendingVoiceChannelId = null;
|
||||
});
|
||||
_showUiErrorSnackBar(
|
||||
area: 'join channel',
|
||||
error: e,
|
||||
displayMessage: l10n.channelJoinFailedFlooding,
|
||||
);
|
||||
return;
|
||||
}
|
||||
final message = channelJoinErrorMessage(l10n, e);
|
||||
setState(() => _pendingVoiceChannelId = null);
|
||||
setState(() {
|
||||
_pendingVoiceChannelId = null;
|
||||
});
|
||||
_showUiErrorSnackBar(
|
||||
area: 'join channel',
|
||||
error: e,
|
||||
@@ -1110,6 +1185,20 @@ class _BetaHomeState extends State<_BetaHome> with WidgetsBindingObserver {
|
||||
}
|
||||
}
|
||||
|
||||
bool _isAlreadyInChannel(Object error) {
|
||||
if (error is rust_err.BridgeError_ServerRejected) {
|
||||
return error.code == 0x0302;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool _isFlooding(Object error) {
|
||||
if (error is rust_err.BridgeError_ServerRejected) {
|
||||
return error.code == 0x020c;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
Future<void> _onToggleHardMute() async {
|
||||
// Don't allow manual unmute when talk-power-muted.
|
||||
if (_hardMuteByTalkPower && _hardMute) {
|
||||
@@ -1285,10 +1374,6 @@ class _BetaHomeState extends State<_BetaHome> with WidgetsBindingObserver {
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> _onRefresh() async {
|
||||
await _refreshSnapshot(recordActivity: true, reportErrors: true);
|
||||
}
|
||||
|
||||
Future<void> _refreshSnapshot({
|
||||
required bool recordActivity,
|
||||
required bool reportErrors,
|
||||
@@ -1597,6 +1682,110 @@ class _BetaHomeState extends State<_BetaHome> with WidgetsBindingObserver {
|
||||
};
|
||||
}
|
||||
|
||||
void _applyClientDelta(bool Function(rust.BridgeClient) test, rust.BridgeClient Function(rust.BridgeClient) update) {
|
||||
final snap = _snapshot;
|
||||
if (snap == null) return;
|
||||
final clients = snap.clients.map((c) => test(c) ? update(c) : c).toList();
|
||||
setState(() {
|
||||
_snapshot = rust.BridgeSnapshot(
|
||||
serverName: snap.serverName,
|
||||
welcomeMessage: snap.welcomeMessage,
|
||||
platform: snap.platform,
|
||||
version: snap.version,
|
||||
channels: snap.channels,
|
||||
clients: clients,
|
||||
ownClientId: snap.ownClientId,
|
||||
);
|
||||
_notifyChatFeedChanged();
|
||||
});
|
||||
}
|
||||
|
||||
void _applyClientAdd(rust.BridgeClient client) {
|
||||
final snap = _snapshot;
|
||||
if (snap == null) return;
|
||||
setState(() {
|
||||
_snapshot = rust.BridgeSnapshot(
|
||||
serverName: snap.serverName,
|
||||
welcomeMessage: snap.welcomeMessage,
|
||||
platform: snap.platform,
|
||||
version: snap.version,
|
||||
channels: snap.channels,
|
||||
clients: [...snap.clients, client],
|
||||
ownClientId: snap.ownClientId,
|
||||
);
|
||||
_notifyChatFeedChanged();
|
||||
});
|
||||
}
|
||||
|
||||
void _applyClientRemove(BigInt clientId) {
|
||||
final snap = _snapshot;
|
||||
if (snap == null) return;
|
||||
setState(() {
|
||||
_snapshot = rust.BridgeSnapshot(
|
||||
serverName: snap.serverName,
|
||||
welcomeMessage: snap.welcomeMessage,
|
||||
platform: snap.platform,
|
||||
version: snap.version,
|
||||
channels: snap.channels,
|
||||
clients: snap.clients.where((c) => c.id != clientId).toList(),
|
||||
ownClientId: snap.ownClientId,
|
||||
);
|
||||
_notifyChatFeedChanged();
|
||||
});
|
||||
}
|
||||
|
||||
void _applyChannelAdd(rust.BridgeChannel channel) {
|
||||
final snap = _snapshot;
|
||||
if (snap == null) return;
|
||||
setState(() {
|
||||
_snapshot = rust.BridgeSnapshot(
|
||||
serverName: snap.serverName,
|
||||
welcomeMessage: snap.welcomeMessage,
|
||||
platform: snap.platform,
|
||||
version: snap.version,
|
||||
channels: [...snap.channels, channel],
|
||||
clients: snap.clients,
|
||||
ownClientId: snap.ownClientId,
|
||||
);
|
||||
_notifyChatFeedChanged();
|
||||
});
|
||||
}
|
||||
|
||||
void _applyChannelRemove(BigInt channelId) {
|
||||
final snap = _snapshot;
|
||||
if (snap == null) return;
|
||||
setState(() {
|
||||
_snapshot = rust.BridgeSnapshot(
|
||||
serverName: snap.serverName,
|
||||
welcomeMessage: snap.welcomeMessage,
|
||||
platform: snap.platform,
|
||||
version: snap.version,
|
||||
channels: snap.channels.where((ch) => ch.id != channelId).toList(),
|
||||
clients: snap.clients,
|
||||
ownClientId: snap.ownClientId,
|
||||
);
|
||||
_notifyChatFeedChanged();
|
||||
});
|
||||
}
|
||||
|
||||
void _applyChannelDelta(bool Function(rust.BridgeChannel) test, rust.BridgeChannel Function(rust.BridgeChannel) update) {
|
||||
final snap = _snapshot;
|
||||
if (snap == null) return;
|
||||
final channels = snap.channels.map((ch) => test(ch) ? update(ch) : ch).toList();
|
||||
setState(() {
|
||||
_snapshot = rust.BridgeSnapshot(
|
||||
serverName: snap.serverName,
|
||||
welcomeMessage: snap.welcomeMessage,
|
||||
platform: snap.platform,
|
||||
version: snap.version,
|
||||
channels: channels,
|
||||
clients: snap.clients,
|
||||
ownClientId: snap.ownClientId,
|
||||
);
|
||||
_notifyChatFeedChanged();
|
||||
});
|
||||
}
|
||||
|
||||
void _applySnapshot(rust.BridgeSnapshot snap) {
|
||||
_snapshot = snap;
|
||||
_phase = phaseAfterSnapshotApplied(_phase);
|
||||
|
||||
@@ -9,7 +9,8 @@ import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart';
|
||||
import 'package:freezed_annotation/freezed_annotation.dart' hide protected;
|
||||
part 'api.freezed.dart';
|
||||
|
||||
// These functions are ignored because they are not marked as `pub`: `install_panic_diagnostic_hook`, `log_file_path`, `log_sink`, `map_join_error_code`, `map_join_sync_state`, `open_log_file`, `permission_events`, `publish_permission_state`, `runtime`, `session`, `task_join_error`, `transmit_mode_from_u8`
|
||||
// These functions are ignored because they are not marked as `pub`: `dispatch_platform_audio_event`, `install_panic_diagnostic_hook`, `log_file_path`, `log_sink`, `map_join_error_code`, `map_join_sync_state`, `open_log_file`, `permission_events`, `platform_audio_events`, `process`, `publish_permission_state`, `runtime`, `session`, `task_join_error`, `transmit_mode_from_u8`
|
||||
// These types are ignored because they are neither used by any `pub` functions nor (for structs and enums) marked `#[frb(unignore)]`: `PlatformAudioEvent`
|
||||
// These function are ignored because they are on traits that is not defined in current crate (put an empty `#[frb]` on it to unignore): `assert_fields_are_eq`, `assert_fields_are_eq`, `assert_fields_are_eq`, `assert_fields_are_eq`, `assert_fields_are_eq`, `assert_fields_are_eq`, `assert_fields_are_eq`, `assert_fields_are_eq`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `eq`, `eq`, `eq`, `eq`, `eq`, `eq`, `eq`, `eq`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `from`, `from`, `from`, `from`, `from`, `from`, `from`, `from`, `from`, `from`, `from`, `from`, `from`, `from`, `from`, `from`, `from`, `from`, `from`, `from`, `from`, `from`, `from`, `from`, `from`
|
||||
// These functions are ignored (category: IgnoreBecauseExplicitAttribute): `from_kotlin_str`, `to_permission_gate`
|
||||
|
||||
@@ -1090,17 +1091,6 @@ sealed class BridgeEvent with _$BridgeEvent {
|
||||
/// Audio engine stopped.
|
||||
const factory BridgeEvent.audioStopped() = BridgeEvent_AudioStopped;
|
||||
|
||||
/// Snapshot probe observed a change in channel/client counts.
|
||||
/// UI uses this to drive an auto-refresh without active
|
||||
/// polling.
|
||||
const factory BridgeEvent.snapshotChanged({
|
||||
/// Latest channel count.
|
||||
required int channels,
|
||||
|
||||
/// Latest client count.
|
||||
required int clients,
|
||||
}) = BridgeEvent_SnapshotChanged;
|
||||
|
||||
/// Detected desktop Push-to-Talk capability (gen2 v0.9.3,
|
||||
/// DEC-023..028). The fields carry only privacy-safe values per
|
||||
/// DEC-027: the capability level, a stable backend identifier,
|
||||
@@ -1209,9 +1199,50 @@ sealed class BridgeEvent with _$BridgeEvent {
|
||||
|
||||
/// Audio route changed (speaker/earpiece/BT/wired).
|
||||
const factory BridgeEvent.audioRouteChanged({
|
||||
/// The new audio route.
|
||||
required BridgeAudioRoute route,
|
||||
}) = BridgeEvent_AudioRouteChanged;
|
||||
const factory BridgeEvent.clientMoved({
|
||||
required BigInt clientId,
|
||||
required BigInt newChannelId,
|
||||
}) = BridgeEvent_ClientMoved;
|
||||
const factory BridgeEvent.clientJoined({
|
||||
required BigInt clientId,
|
||||
required BigInt channelId,
|
||||
required String name,
|
||||
required bool inputMuted,
|
||||
required bool outputMuted,
|
||||
required bool isServerQuery,
|
||||
required int talkPower,
|
||||
required bool talkPowerGranted,
|
||||
}) = BridgeEvent_ClientJoined;
|
||||
const factory BridgeEvent.clientLeft({
|
||||
required BigInt clientId,
|
||||
required String name,
|
||||
}) = BridgeEvent_ClientLeft;
|
||||
const factory BridgeEvent.clientUpdated({
|
||||
required BigInt clientId,
|
||||
required bool inputMuted,
|
||||
required bool outputMuted,
|
||||
required bool isServerQuery,
|
||||
required int talkPower,
|
||||
required bool talkPowerGranted,
|
||||
}) = BridgeEvent_ClientUpdated;
|
||||
const factory BridgeEvent.channelAdded({
|
||||
required BigInt id,
|
||||
required BigInt parent,
|
||||
required String name,
|
||||
required PlatformInt64 order,
|
||||
required bool hasPassword,
|
||||
int? neededTalkPower,
|
||||
}) = BridgeEvent_ChannelAdded;
|
||||
const factory BridgeEvent.channelRemoved({required BigInt id}) =
|
||||
BridgeEvent_ChannelRemoved;
|
||||
const factory BridgeEvent.channelUpdated({
|
||||
required BigInt id,
|
||||
required String name,
|
||||
required bool hasPassword,
|
||||
int? neededTalkPower,
|
||||
}) = BridgeEvent_ChannelUpdated;
|
||||
}
|
||||
|
||||
/// Bridge iOS voice-processing mode.
|
||||
|
||||
@@ -55,7 +55,7 @@ extension BridgeEventPatterns on BridgeEvent {
|
||||
/// }
|
||||
/// ```
|
||||
|
||||
@optionalTypeArgs TResult maybeMap<TResult extends Object?>({TResult Function( BridgeEvent_Connected value)? connected,TResult Function( BridgeEvent_Lost value)? lost,TResult Function( BridgeEvent_Reconnecting value)? reconnecting,TResult Function( BridgeEvent_Disconnected value)? disconnected,TResult Function( BridgeEvent_AudioStarted value)? audioStarted,TResult Function( BridgeEvent_AudioStopped value)? audioStopped,TResult Function( BridgeEvent_SnapshotChanged value)? snapshotChanged,TResult Function( BridgeEvent_PttCapability value)? pttCapability,TResult Function( BridgeEvent_VoiceState value)? voiceState,TResult Function( BridgeEvent_InterruptionState value)? interruptionState,TResult Function( BridgeEvent_PermissionState value)? permissionState,TResult Function( BridgeEvent_ChatMessage value)? chatMessage,TResult Function( BridgeEvent_ServerActivity value)? serverActivity,TResult Function( BridgeEvent_AudioRouteChanged value)? audioRouteChanged,required TResult orElse(),}){
|
||||
@optionalTypeArgs TResult maybeMap<TResult extends Object?>({TResult Function( BridgeEvent_Connected value)? connected,TResult Function( BridgeEvent_Lost value)? lost,TResult Function( BridgeEvent_Reconnecting value)? reconnecting,TResult Function( BridgeEvent_Disconnected value)? disconnected,TResult Function( BridgeEvent_AudioStarted value)? audioStarted,TResult Function( BridgeEvent_AudioStopped value)? audioStopped,TResult Function( BridgeEvent_PttCapability value)? pttCapability,TResult Function( BridgeEvent_VoiceState value)? voiceState,TResult Function( BridgeEvent_InterruptionState value)? interruptionState,TResult Function( BridgeEvent_PermissionState value)? permissionState,TResult Function( BridgeEvent_ChatMessage value)? chatMessage,TResult Function( BridgeEvent_ServerActivity value)? serverActivity,TResult Function( BridgeEvent_AudioRouteChanged value)? audioRouteChanged,TResult Function( BridgeEvent_ClientMoved value)? clientMoved,TResult Function( BridgeEvent_ClientJoined value)? clientJoined,TResult Function( BridgeEvent_ClientLeft value)? clientLeft,TResult Function( BridgeEvent_ClientUpdated value)? clientUpdated,TResult Function( BridgeEvent_ChannelAdded value)? channelAdded,TResult Function( BridgeEvent_ChannelRemoved value)? channelRemoved,TResult Function( BridgeEvent_ChannelUpdated value)? channelUpdated,required TResult orElse(),}){
|
||||
final _that = this;
|
||||
switch (_that) {
|
||||
case BridgeEvent_Connected() when connected != null:
|
||||
@@ -64,15 +64,21 @@ return lost(_that);case BridgeEvent_Reconnecting() when reconnecting != null:
|
||||
return reconnecting(_that);case BridgeEvent_Disconnected() when disconnected != null:
|
||||
return disconnected(_that);case BridgeEvent_AudioStarted() when audioStarted != null:
|
||||
return audioStarted(_that);case BridgeEvent_AudioStopped() when audioStopped != null:
|
||||
return audioStopped(_that);case BridgeEvent_SnapshotChanged() when snapshotChanged != null:
|
||||
return snapshotChanged(_that);case BridgeEvent_PttCapability() when pttCapability != null:
|
||||
return audioStopped(_that);case BridgeEvent_PttCapability() when pttCapability != null:
|
||||
return pttCapability(_that);case BridgeEvent_VoiceState() when voiceState != null:
|
||||
return voiceState(_that);case BridgeEvent_InterruptionState() when interruptionState != null:
|
||||
return interruptionState(_that);case BridgeEvent_PermissionState() when permissionState != null:
|
||||
return permissionState(_that);case BridgeEvent_ChatMessage() when chatMessage != null:
|
||||
return chatMessage(_that);case BridgeEvent_ServerActivity() when serverActivity != null:
|
||||
return serverActivity(_that);case BridgeEvent_AudioRouteChanged() when audioRouteChanged != null:
|
||||
return audioRouteChanged(_that);case _:
|
||||
return audioRouteChanged(_that);case BridgeEvent_ClientMoved() when clientMoved != null:
|
||||
return clientMoved(_that);case BridgeEvent_ClientJoined() when clientJoined != null:
|
||||
return clientJoined(_that);case BridgeEvent_ClientLeft() when clientLeft != null:
|
||||
return clientLeft(_that);case BridgeEvent_ClientUpdated() when clientUpdated != null:
|
||||
return clientUpdated(_that);case BridgeEvent_ChannelAdded() when channelAdded != null:
|
||||
return channelAdded(_that);case BridgeEvent_ChannelRemoved() when channelRemoved != null:
|
||||
return channelRemoved(_that);case BridgeEvent_ChannelUpdated() when channelUpdated != null:
|
||||
return channelUpdated(_that);case _:
|
||||
return orElse();
|
||||
|
||||
}
|
||||
@@ -90,7 +96,7 @@ return audioRouteChanged(_that);case _:
|
||||
/// }
|
||||
/// ```
|
||||
|
||||
@optionalTypeArgs TResult map<TResult extends Object?>({required TResult Function( BridgeEvent_Connected value) connected,required TResult Function( BridgeEvent_Lost value) lost,required TResult Function( BridgeEvent_Reconnecting value) reconnecting,required TResult Function( BridgeEvent_Disconnected value) disconnected,required TResult Function( BridgeEvent_AudioStarted value) audioStarted,required TResult Function( BridgeEvent_AudioStopped value) audioStopped,required TResult Function( BridgeEvent_SnapshotChanged value) snapshotChanged,required TResult Function( BridgeEvent_PttCapability value) pttCapability,required TResult Function( BridgeEvent_VoiceState value) voiceState,required TResult Function( BridgeEvent_InterruptionState value) interruptionState,required TResult Function( BridgeEvent_PermissionState value) permissionState,required TResult Function( BridgeEvent_ChatMessage value) chatMessage,required TResult Function( BridgeEvent_ServerActivity value) serverActivity,required TResult Function( BridgeEvent_AudioRouteChanged value) audioRouteChanged,}){
|
||||
@optionalTypeArgs TResult map<TResult extends Object?>({required TResult Function( BridgeEvent_Connected value) connected,required TResult Function( BridgeEvent_Lost value) lost,required TResult Function( BridgeEvent_Reconnecting value) reconnecting,required TResult Function( BridgeEvent_Disconnected value) disconnected,required TResult Function( BridgeEvent_AudioStarted value) audioStarted,required TResult Function( BridgeEvent_AudioStopped value) audioStopped,required TResult Function( BridgeEvent_PttCapability value) pttCapability,required TResult Function( BridgeEvent_VoiceState value) voiceState,required TResult Function( BridgeEvent_InterruptionState value) interruptionState,required TResult Function( BridgeEvent_PermissionState value) permissionState,required TResult Function( BridgeEvent_ChatMessage value) chatMessage,required TResult Function( BridgeEvent_ServerActivity value) serverActivity,required TResult Function( BridgeEvent_AudioRouteChanged value) audioRouteChanged,required TResult Function( BridgeEvent_ClientMoved value) clientMoved,required TResult Function( BridgeEvent_ClientJoined value) clientJoined,required TResult Function( BridgeEvent_ClientLeft value) clientLeft,required TResult Function( BridgeEvent_ClientUpdated value) clientUpdated,required TResult Function( BridgeEvent_ChannelAdded value) channelAdded,required TResult Function( BridgeEvent_ChannelRemoved value) channelRemoved,required TResult Function( BridgeEvent_ChannelUpdated value) channelUpdated,}){
|
||||
final _that = this;
|
||||
switch (_that) {
|
||||
case BridgeEvent_Connected():
|
||||
@@ -99,15 +105,21 @@ return lost(_that);case BridgeEvent_Reconnecting():
|
||||
return reconnecting(_that);case BridgeEvent_Disconnected():
|
||||
return disconnected(_that);case BridgeEvent_AudioStarted():
|
||||
return audioStarted(_that);case BridgeEvent_AudioStopped():
|
||||
return audioStopped(_that);case BridgeEvent_SnapshotChanged():
|
||||
return snapshotChanged(_that);case BridgeEvent_PttCapability():
|
||||
return audioStopped(_that);case BridgeEvent_PttCapability():
|
||||
return pttCapability(_that);case BridgeEvent_VoiceState():
|
||||
return voiceState(_that);case BridgeEvent_InterruptionState():
|
||||
return interruptionState(_that);case BridgeEvent_PermissionState():
|
||||
return permissionState(_that);case BridgeEvent_ChatMessage():
|
||||
return chatMessage(_that);case BridgeEvent_ServerActivity():
|
||||
return serverActivity(_that);case BridgeEvent_AudioRouteChanged():
|
||||
return audioRouteChanged(_that);}
|
||||
return audioRouteChanged(_that);case BridgeEvent_ClientMoved():
|
||||
return clientMoved(_that);case BridgeEvent_ClientJoined():
|
||||
return clientJoined(_that);case BridgeEvent_ClientLeft():
|
||||
return clientLeft(_that);case BridgeEvent_ClientUpdated():
|
||||
return clientUpdated(_that);case BridgeEvent_ChannelAdded():
|
||||
return channelAdded(_that);case BridgeEvent_ChannelRemoved():
|
||||
return channelRemoved(_that);case BridgeEvent_ChannelUpdated():
|
||||
return channelUpdated(_that);}
|
||||
}
|
||||
/// A variant of `map` that fallback to returning `null`.
|
||||
///
|
||||
@@ -121,7 +133,7 @@ return audioRouteChanged(_that);}
|
||||
/// }
|
||||
/// ```
|
||||
|
||||
@optionalTypeArgs TResult? mapOrNull<TResult extends Object?>({TResult? Function( BridgeEvent_Connected value)? connected,TResult? Function( BridgeEvent_Lost value)? lost,TResult? Function( BridgeEvent_Reconnecting value)? reconnecting,TResult? Function( BridgeEvent_Disconnected value)? disconnected,TResult? Function( BridgeEvent_AudioStarted value)? audioStarted,TResult? Function( BridgeEvent_AudioStopped value)? audioStopped,TResult? Function( BridgeEvent_SnapshotChanged value)? snapshotChanged,TResult? Function( BridgeEvent_PttCapability value)? pttCapability,TResult? Function( BridgeEvent_VoiceState value)? voiceState,TResult? Function( BridgeEvent_InterruptionState value)? interruptionState,TResult? Function( BridgeEvent_PermissionState value)? permissionState,TResult? Function( BridgeEvent_ChatMessage value)? chatMessage,TResult? Function( BridgeEvent_ServerActivity value)? serverActivity,TResult? Function( BridgeEvent_AudioRouteChanged value)? audioRouteChanged,}){
|
||||
@optionalTypeArgs TResult? mapOrNull<TResult extends Object?>({TResult? Function( BridgeEvent_Connected value)? connected,TResult? Function( BridgeEvent_Lost value)? lost,TResult? Function( BridgeEvent_Reconnecting value)? reconnecting,TResult? Function( BridgeEvent_Disconnected value)? disconnected,TResult? Function( BridgeEvent_AudioStarted value)? audioStarted,TResult? Function( BridgeEvent_AudioStopped value)? audioStopped,TResult? Function( BridgeEvent_PttCapability value)? pttCapability,TResult? Function( BridgeEvent_VoiceState value)? voiceState,TResult? Function( BridgeEvent_InterruptionState value)? interruptionState,TResult? Function( BridgeEvent_PermissionState value)? permissionState,TResult? Function( BridgeEvent_ChatMessage value)? chatMessage,TResult? Function( BridgeEvent_ServerActivity value)? serverActivity,TResult? Function( BridgeEvent_AudioRouteChanged value)? audioRouteChanged,TResult? Function( BridgeEvent_ClientMoved value)? clientMoved,TResult? Function( BridgeEvent_ClientJoined value)? clientJoined,TResult? Function( BridgeEvent_ClientLeft value)? clientLeft,TResult? Function( BridgeEvent_ClientUpdated value)? clientUpdated,TResult? Function( BridgeEvent_ChannelAdded value)? channelAdded,TResult? Function( BridgeEvent_ChannelRemoved value)? channelRemoved,TResult? Function( BridgeEvent_ChannelUpdated value)? channelUpdated,}){
|
||||
final _that = this;
|
||||
switch (_that) {
|
||||
case BridgeEvent_Connected() when connected != null:
|
||||
@@ -130,15 +142,21 @@ return lost(_that);case BridgeEvent_Reconnecting() when reconnecting != null:
|
||||
return reconnecting(_that);case BridgeEvent_Disconnected() when disconnected != null:
|
||||
return disconnected(_that);case BridgeEvent_AudioStarted() when audioStarted != null:
|
||||
return audioStarted(_that);case BridgeEvent_AudioStopped() when audioStopped != null:
|
||||
return audioStopped(_that);case BridgeEvent_SnapshotChanged() when snapshotChanged != null:
|
||||
return snapshotChanged(_that);case BridgeEvent_PttCapability() when pttCapability != null:
|
||||
return audioStopped(_that);case BridgeEvent_PttCapability() when pttCapability != null:
|
||||
return pttCapability(_that);case BridgeEvent_VoiceState() when voiceState != null:
|
||||
return voiceState(_that);case BridgeEvent_InterruptionState() when interruptionState != null:
|
||||
return interruptionState(_that);case BridgeEvent_PermissionState() when permissionState != null:
|
||||
return permissionState(_that);case BridgeEvent_ChatMessage() when chatMessage != null:
|
||||
return chatMessage(_that);case BridgeEvent_ServerActivity() when serverActivity != null:
|
||||
return serverActivity(_that);case BridgeEvent_AudioRouteChanged() when audioRouteChanged != null:
|
||||
return audioRouteChanged(_that);case _:
|
||||
return audioRouteChanged(_that);case BridgeEvent_ClientMoved() when clientMoved != null:
|
||||
return clientMoved(_that);case BridgeEvent_ClientJoined() when clientJoined != null:
|
||||
return clientJoined(_that);case BridgeEvent_ClientLeft() when clientLeft != null:
|
||||
return clientLeft(_that);case BridgeEvent_ClientUpdated() when clientUpdated != null:
|
||||
return clientUpdated(_that);case BridgeEvent_ChannelAdded() when channelAdded != null:
|
||||
return channelAdded(_that);case BridgeEvent_ChannelRemoved() when channelRemoved != null:
|
||||
return channelRemoved(_that);case BridgeEvent_ChannelUpdated() when channelUpdated != null:
|
||||
return channelUpdated(_that);case _:
|
||||
return null;
|
||||
|
||||
}
|
||||
@@ -155,7 +173,7 @@ return audioRouteChanged(_that);case _:
|
||||
/// }
|
||||
/// ```
|
||||
|
||||
@optionalTypeArgs TResult maybeWhen<TResult extends Object?>({TResult Function( String serverName)? connected,TResult Function( String reason)? lost,TResult Function( int attempt, int delaySecs)? reconnecting,TResult Function( String reason)? disconnected,TResult Function()? audioStarted,TResult Function()? audioStopped,TResult Function( int channels, int clients)? snapshotChanged,TResult Function( String level, String backendId, String boundInputClass)? pttCapability,TResult Function( bool inChannel, BridgeTransmitMode transmitMode, bool mute, int releaseTailMs, BigInt? currentChannelId, BigInt? pendingTargetChannelId, bool canJoin, bool canLeave, BridgeVoiceJoinSyncState joinSyncState, BridgeVoiceJoinErrorCode? joinErrorCode)? voiceState,TResult Function( bool began, bool shouldResume)? interruptionState,TResult Function( String permission, PermissionStateKind state)? permissionState,TResult Function( BigInt senderId, String senderName, String message, BridgeMessageTarget target)? chatMessage,TResult Function( String message)? serverActivity,TResult Function( BridgeAudioRoute route)? audioRouteChanged,required TResult orElse(),}) {final _that = this;
|
||||
@optionalTypeArgs TResult maybeWhen<TResult extends Object?>({TResult Function( String serverName)? connected,TResult Function( String reason)? lost,TResult Function( int attempt, int delaySecs)? reconnecting,TResult Function( String reason)? disconnected,TResult Function()? audioStarted,TResult Function()? audioStopped,TResult Function( String level, String backendId, String boundInputClass)? pttCapability,TResult Function( bool inChannel, BridgeTransmitMode transmitMode, bool mute, int releaseTailMs, BigInt? currentChannelId, BigInt? pendingTargetChannelId, bool canJoin, bool canLeave, BridgeVoiceJoinSyncState joinSyncState, BridgeVoiceJoinErrorCode? joinErrorCode)? voiceState,TResult Function( bool began, bool shouldResume)? interruptionState,TResult Function( String permission, PermissionStateKind state)? permissionState,TResult Function( BigInt senderId, String senderName, String message, BridgeMessageTarget target)? chatMessage,TResult Function( String message)? serverActivity,TResult Function( BridgeAudioRoute route)? audioRouteChanged,TResult Function( BigInt clientId, BigInt newChannelId)? clientMoved,TResult Function( BigInt clientId, BigInt channelId, String name, bool inputMuted, bool outputMuted, bool isServerQuery, int talkPower, bool talkPowerGranted)? clientJoined,TResult Function( BigInt clientId, String name)? clientLeft,TResult Function( BigInt clientId, bool inputMuted, bool outputMuted, bool isServerQuery, int talkPower, bool talkPowerGranted)? clientUpdated,TResult Function( BigInt id, BigInt parent, String name, PlatformInt64 order, bool hasPassword, int? neededTalkPower)? channelAdded,TResult Function( BigInt id)? channelRemoved,TResult Function( BigInt id, String name, bool hasPassword, int? neededTalkPower)? channelUpdated,required TResult orElse(),}) {final _that = this;
|
||||
switch (_that) {
|
||||
case BridgeEvent_Connected() when connected != null:
|
||||
return connected(_that.serverName);case BridgeEvent_Lost() when lost != null:
|
||||
@@ -163,15 +181,21 @@ return lost(_that.reason);case BridgeEvent_Reconnecting() when reconnecting != n
|
||||
return reconnecting(_that.attempt,_that.delaySecs);case BridgeEvent_Disconnected() when disconnected != null:
|
||||
return disconnected(_that.reason);case BridgeEvent_AudioStarted() when audioStarted != null:
|
||||
return audioStarted();case BridgeEvent_AudioStopped() when audioStopped != null:
|
||||
return audioStopped();case BridgeEvent_SnapshotChanged() when snapshotChanged != null:
|
||||
return snapshotChanged(_that.channels,_that.clients);case BridgeEvent_PttCapability() when pttCapability != null:
|
||||
return audioStopped();case BridgeEvent_PttCapability() when pttCapability != null:
|
||||
return pttCapability(_that.level,_that.backendId,_that.boundInputClass);case BridgeEvent_VoiceState() when voiceState != null:
|
||||
return voiceState(_that.inChannel,_that.transmitMode,_that.mute,_that.releaseTailMs,_that.currentChannelId,_that.pendingTargetChannelId,_that.canJoin,_that.canLeave,_that.joinSyncState,_that.joinErrorCode);case BridgeEvent_InterruptionState() when interruptionState != null:
|
||||
return interruptionState(_that.began,_that.shouldResume);case BridgeEvent_PermissionState() when permissionState != null:
|
||||
return permissionState(_that.permission,_that.state);case BridgeEvent_ChatMessage() when chatMessage != null:
|
||||
return chatMessage(_that.senderId,_that.senderName,_that.message,_that.target);case BridgeEvent_ServerActivity() when serverActivity != null:
|
||||
return serverActivity(_that.message);case BridgeEvent_AudioRouteChanged() when audioRouteChanged != null:
|
||||
return audioRouteChanged(_that.route);case _:
|
||||
return audioRouteChanged(_that.route);case BridgeEvent_ClientMoved() when clientMoved != null:
|
||||
return clientMoved(_that.clientId,_that.newChannelId);case BridgeEvent_ClientJoined() when clientJoined != null:
|
||||
return clientJoined(_that.clientId,_that.channelId,_that.name,_that.inputMuted,_that.outputMuted,_that.isServerQuery,_that.talkPower,_that.talkPowerGranted);case BridgeEvent_ClientLeft() when clientLeft != null:
|
||||
return clientLeft(_that.clientId,_that.name);case BridgeEvent_ClientUpdated() when clientUpdated != null:
|
||||
return clientUpdated(_that.clientId,_that.inputMuted,_that.outputMuted,_that.isServerQuery,_that.talkPower,_that.talkPowerGranted);case BridgeEvent_ChannelAdded() when channelAdded != null:
|
||||
return channelAdded(_that.id,_that.parent,_that.name,_that.order,_that.hasPassword,_that.neededTalkPower);case BridgeEvent_ChannelRemoved() when channelRemoved != null:
|
||||
return channelRemoved(_that.id);case BridgeEvent_ChannelUpdated() when channelUpdated != null:
|
||||
return channelUpdated(_that.id,_that.name,_that.hasPassword,_that.neededTalkPower);case _:
|
||||
return orElse();
|
||||
|
||||
}
|
||||
@@ -189,7 +213,7 @@ return audioRouteChanged(_that.route);case _:
|
||||
/// }
|
||||
/// ```
|
||||
|
||||
@optionalTypeArgs TResult when<TResult extends Object?>({required TResult Function( String serverName) connected,required TResult Function( String reason) lost,required TResult Function( int attempt, int delaySecs) reconnecting,required TResult Function( String reason) disconnected,required TResult Function() audioStarted,required TResult Function() audioStopped,required TResult Function( int channels, int clients) snapshotChanged,required TResult Function( String level, String backendId, String boundInputClass) pttCapability,required TResult Function( bool inChannel, BridgeTransmitMode transmitMode, bool mute, int releaseTailMs, BigInt? currentChannelId, BigInt? pendingTargetChannelId, bool canJoin, bool canLeave, BridgeVoiceJoinSyncState joinSyncState, BridgeVoiceJoinErrorCode? joinErrorCode) voiceState,required TResult Function( bool began, bool shouldResume) interruptionState,required TResult Function( String permission, PermissionStateKind state) permissionState,required TResult Function( BigInt senderId, String senderName, String message, BridgeMessageTarget target) chatMessage,required TResult Function( String message) serverActivity,required TResult Function( BridgeAudioRoute route) audioRouteChanged,}) {final _that = this;
|
||||
@optionalTypeArgs TResult when<TResult extends Object?>({required TResult Function( String serverName) connected,required TResult Function( String reason) lost,required TResult Function( int attempt, int delaySecs) reconnecting,required TResult Function( String reason) disconnected,required TResult Function() audioStarted,required TResult Function() audioStopped,required TResult Function( String level, String backendId, String boundInputClass) pttCapability,required TResult Function( bool inChannel, BridgeTransmitMode transmitMode, bool mute, int releaseTailMs, BigInt? currentChannelId, BigInt? pendingTargetChannelId, bool canJoin, bool canLeave, BridgeVoiceJoinSyncState joinSyncState, BridgeVoiceJoinErrorCode? joinErrorCode) voiceState,required TResult Function( bool began, bool shouldResume) interruptionState,required TResult Function( String permission, PermissionStateKind state) permissionState,required TResult Function( BigInt senderId, String senderName, String message, BridgeMessageTarget target) chatMessage,required TResult Function( String message) serverActivity,required TResult Function( BridgeAudioRoute route) audioRouteChanged,required TResult Function( BigInt clientId, BigInt newChannelId) clientMoved,required TResult Function( BigInt clientId, BigInt channelId, String name, bool inputMuted, bool outputMuted, bool isServerQuery, int talkPower, bool talkPowerGranted) clientJoined,required TResult Function( BigInt clientId, String name) clientLeft,required TResult Function( BigInt clientId, bool inputMuted, bool outputMuted, bool isServerQuery, int talkPower, bool talkPowerGranted) clientUpdated,required TResult Function( BigInt id, BigInt parent, String name, PlatformInt64 order, bool hasPassword, int? neededTalkPower) channelAdded,required TResult Function( BigInt id) channelRemoved,required TResult Function( BigInt id, String name, bool hasPassword, int? neededTalkPower) channelUpdated,}) {final _that = this;
|
||||
switch (_that) {
|
||||
case BridgeEvent_Connected():
|
||||
return connected(_that.serverName);case BridgeEvent_Lost():
|
||||
@@ -197,15 +221,21 @@ return lost(_that.reason);case BridgeEvent_Reconnecting():
|
||||
return reconnecting(_that.attempt,_that.delaySecs);case BridgeEvent_Disconnected():
|
||||
return disconnected(_that.reason);case BridgeEvent_AudioStarted():
|
||||
return audioStarted();case BridgeEvent_AudioStopped():
|
||||
return audioStopped();case BridgeEvent_SnapshotChanged():
|
||||
return snapshotChanged(_that.channels,_that.clients);case BridgeEvent_PttCapability():
|
||||
return audioStopped();case BridgeEvent_PttCapability():
|
||||
return pttCapability(_that.level,_that.backendId,_that.boundInputClass);case BridgeEvent_VoiceState():
|
||||
return voiceState(_that.inChannel,_that.transmitMode,_that.mute,_that.releaseTailMs,_that.currentChannelId,_that.pendingTargetChannelId,_that.canJoin,_that.canLeave,_that.joinSyncState,_that.joinErrorCode);case BridgeEvent_InterruptionState():
|
||||
return interruptionState(_that.began,_that.shouldResume);case BridgeEvent_PermissionState():
|
||||
return permissionState(_that.permission,_that.state);case BridgeEvent_ChatMessage():
|
||||
return chatMessage(_that.senderId,_that.senderName,_that.message,_that.target);case BridgeEvent_ServerActivity():
|
||||
return serverActivity(_that.message);case BridgeEvent_AudioRouteChanged():
|
||||
return audioRouteChanged(_that.route);}
|
||||
return audioRouteChanged(_that.route);case BridgeEvent_ClientMoved():
|
||||
return clientMoved(_that.clientId,_that.newChannelId);case BridgeEvent_ClientJoined():
|
||||
return clientJoined(_that.clientId,_that.channelId,_that.name,_that.inputMuted,_that.outputMuted,_that.isServerQuery,_that.talkPower,_that.talkPowerGranted);case BridgeEvent_ClientLeft():
|
||||
return clientLeft(_that.clientId,_that.name);case BridgeEvent_ClientUpdated():
|
||||
return clientUpdated(_that.clientId,_that.inputMuted,_that.outputMuted,_that.isServerQuery,_that.talkPower,_that.talkPowerGranted);case BridgeEvent_ChannelAdded():
|
||||
return channelAdded(_that.id,_that.parent,_that.name,_that.order,_that.hasPassword,_that.neededTalkPower);case BridgeEvent_ChannelRemoved():
|
||||
return channelRemoved(_that.id);case BridgeEvent_ChannelUpdated():
|
||||
return channelUpdated(_that.id,_that.name,_that.hasPassword,_that.neededTalkPower);}
|
||||
}
|
||||
/// A variant of `when` that fallback to returning `null`
|
||||
///
|
||||
@@ -219,7 +249,7 @@ return audioRouteChanged(_that.route);}
|
||||
/// }
|
||||
/// ```
|
||||
|
||||
@optionalTypeArgs TResult? whenOrNull<TResult extends Object?>({TResult? Function( String serverName)? connected,TResult? Function( String reason)? lost,TResult? Function( int attempt, int delaySecs)? reconnecting,TResult? Function( String reason)? disconnected,TResult? Function()? audioStarted,TResult? Function()? audioStopped,TResult? Function( int channels, int clients)? snapshotChanged,TResult? Function( String level, String backendId, String boundInputClass)? pttCapability,TResult? Function( bool inChannel, BridgeTransmitMode transmitMode, bool mute, int releaseTailMs, BigInt? currentChannelId, BigInt? pendingTargetChannelId, bool canJoin, bool canLeave, BridgeVoiceJoinSyncState joinSyncState, BridgeVoiceJoinErrorCode? joinErrorCode)? voiceState,TResult? Function( bool began, bool shouldResume)? interruptionState,TResult? Function( String permission, PermissionStateKind state)? permissionState,TResult? Function( BigInt senderId, String senderName, String message, BridgeMessageTarget target)? chatMessage,TResult? Function( String message)? serverActivity,TResult? Function( BridgeAudioRoute route)? audioRouteChanged,}) {final _that = this;
|
||||
@optionalTypeArgs TResult? whenOrNull<TResult extends Object?>({TResult? Function( String serverName)? connected,TResult? Function( String reason)? lost,TResult? Function( int attempt, int delaySecs)? reconnecting,TResult? Function( String reason)? disconnected,TResult? Function()? audioStarted,TResult? Function()? audioStopped,TResult? Function( String level, String backendId, String boundInputClass)? pttCapability,TResult? Function( bool inChannel, BridgeTransmitMode transmitMode, bool mute, int releaseTailMs, BigInt? currentChannelId, BigInt? pendingTargetChannelId, bool canJoin, bool canLeave, BridgeVoiceJoinSyncState joinSyncState, BridgeVoiceJoinErrorCode? joinErrorCode)? voiceState,TResult? Function( bool began, bool shouldResume)? interruptionState,TResult? Function( String permission, PermissionStateKind state)? permissionState,TResult? Function( BigInt senderId, String senderName, String message, BridgeMessageTarget target)? chatMessage,TResult? Function( String message)? serverActivity,TResult? Function( BridgeAudioRoute route)? audioRouteChanged,TResult? Function( BigInt clientId, BigInt newChannelId)? clientMoved,TResult? Function( BigInt clientId, BigInt channelId, String name, bool inputMuted, bool outputMuted, bool isServerQuery, int talkPower, bool talkPowerGranted)? clientJoined,TResult? Function( BigInt clientId, String name)? clientLeft,TResult? Function( BigInt clientId, bool inputMuted, bool outputMuted, bool isServerQuery, int talkPower, bool talkPowerGranted)? clientUpdated,TResult? Function( BigInt id, BigInt parent, String name, PlatformInt64 order, bool hasPassword, int? neededTalkPower)? channelAdded,TResult? Function( BigInt id)? channelRemoved,TResult? Function( BigInt id, String name, bool hasPassword, int? neededTalkPower)? channelUpdated,}) {final _that = this;
|
||||
switch (_that) {
|
||||
case BridgeEvent_Connected() when connected != null:
|
||||
return connected(_that.serverName);case BridgeEvent_Lost() when lost != null:
|
||||
@@ -227,15 +257,21 @@ return lost(_that.reason);case BridgeEvent_Reconnecting() when reconnecting != n
|
||||
return reconnecting(_that.attempt,_that.delaySecs);case BridgeEvent_Disconnected() when disconnected != null:
|
||||
return disconnected(_that.reason);case BridgeEvent_AudioStarted() when audioStarted != null:
|
||||
return audioStarted();case BridgeEvent_AudioStopped() when audioStopped != null:
|
||||
return audioStopped();case BridgeEvent_SnapshotChanged() when snapshotChanged != null:
|
||||
return snapshotChanged(_that.channels,_that.clients);case BridgeEvent_PttCapability() when pttCapability != null:
|
||||
return audioStopped();case BridgeEvent_PttCapability() when pttCapability != null:
|
||||
return pttCapability(_that.level,_that.backendId,_that.boundInputClass);case BridgeEvent_VoiceState() when voiceState != null:
|
||||
return voiceState(_that.inChannel,_that.transmitMode,_that.mute,_that.releaseTailMs,_that.currentChannelId,_that.pendingTargetChannelId,_that.canJoin,_that.canLeave,_that.joinSyncState,_that.joinErrorCode);case BridgeEvent_InterruptionState() when interruptionState != null:
|
||||
return interruptionState(_that.began,_that.shouldResume);case BridgeEvent_PermissionState() when permissionState != null:
|
||||
return permissionState(_that.permission,_that.state);case BridgeEvent_ChatMessage() when chatMessage != null:
|
||||
return chatMessage(_that.senderId,_that.senderName,_that.message,_that.target);case BridgeEvent_ServerActivity() when serverActivity != null:
|
||||
return serverActivity(_that.message);case BridgeEvent_AudioRouteChanged() when audioRouteChanged != null:
|
||||
return audioRouteChanged(_that.route);case _:
|
||||
return audioRouteChanged(_that.route);case BridgeEvent_ClientMoved() when clientMoved != null:
|
||||
return clientMoved(_that.clientId,_that.newChannelId);case BridgeEvent_ClientJoined() when clientJoined != null:
|
||||
return clientJoined(_that.clientId,_that.channelId,_that.name,_that.inputMuted,_that.outputMuted,_that.isServerQuery,_that.talkPower,_that.talkPowerGranted);case BridgeEvent_ClientLeft() when clientLeft != null:
|
||||
return clientLeft(_that.clientId,_that.name);case BridgeEvent_ClientUpdated() when clientUpdated != null:
|
||||
return clientUpdated(_that.clientId,_that.inputMuted,_that.outputMuted,_that.isServerQuery,_that.talkPower,_that.talkPowerGranted);case BridgeEvent_ChannelAdded() when channelAdded != null:
|
||||
return channelAdded(_that.id,_that.parent,_that.name,_that.order,_that.hasPassword,_that.neededTalkPower);case BridgeEvent_ChannelRemoved() when channelRemoved != null:
|
||||
return channelRemoved(_that.id);case BridgeEvent_ChannelUpdated() when channelUpdated != null:
|
||||
return channelUpdated(_that.id,_that.name,_that.hasPassword,_that.neededTalkPower);case _:
|
||||
return null;
|
||||
|
||||
}
|
||||
@@ -578,76 +614,6 @@ String toString() {
|
||||
|
||||
|
||||
|
||||
/// @nodoc
|
||||
|
||||
|
||||
class BridgeEvent_SnapshotChanged extends BridgeEvent {
|
||||
const BridgeEvent_SnapshotChanged({required this.channels, required this.clients}): super._();
|
||||
|
||||
|
||||
/// Latest channel count.
|
||||
final int channels;
|
||||
/// Latest client count.
|
||||
final int clients;
|
||||
|
||||
/// Create a copy of BridgeEvent
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
@pragma('vm:prefer-inline')
|
||||
$BridgeEvent_SnapshotChangedCopyWith<BridgeEvent_SnapshotChanged> get copyWith => _$BridgeEvent_SnapshotChangedCopyWithImpl<BridgeEvent_SnapshotChanged>(this, _$identity);
|
||||
|
||||
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return identical(this, other) || (other.runtimeType == runtimeType&&other is BridgeEvent_SnapshotChanged&&(identical(other.channels, channels) || other.channels == channels)&&(identical(other.clients, clients) || other.clients == clients));
|
||||
}
|
||||
|
||||
|
||||
@override
|
||||
int get hashCode => Object.hash(runtimeType,channels,clients);
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'BridgeEvent.snapshotChanged(channels: $channels, clients: $clients)';
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
abstract mixin class $BridgeEvent_SnapshotChangedCopyWith<$Res> implements $BridgeEventCopyWith<$Res> {
|
||||
factory $BridgeEvent_SnapshotChangedCopyWith(BridgeEvent_SnapshotChanged value, $Res Function(BridgeEvent_SnapshotChanged) _then) = _$BridgeEvent_SnapshotChangedCopyWithImpl;
|
||||
@useResult
|
||||
$Res call({
|
||||
int channels, int clients
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
/// @nodoc
|
||||
class _$BridgeEvent_SnapshotChangedCopyWithImpl<$Res>
|
||||
implements $BridgeEvent_SnapshotChangedCopyWith<$Res> {
|
||||
_$BridgeEvent_SnapshotChangedCopyWithImpl(this._self, this._then);
|
||||
|
||||
final BridgeEvent_SnapshotChanged _self;
|
||||
final $Res Function(BridgeEvent_SnapshotChanged) _then;
|
||||
|
||||
/// Create a copy of BridgeEvent
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@pragma('vm:prefer-inline') $Res call({Object? channels = null,Object? clients = null,}) {
|
||||
return _then(BridgeEvent_SnapshotChanged(
|
||||
channels: null == channels ? _self.channels : channels // ignore: cast_nullable_to_non_nullable
|
||||
as int,clients: null == clients ? _self.clients : clients // ignore: cast_nullable_to_non_nullable
|
||||
as int,
|
||||
));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
|
||||
|
||||
@@ -1118,7 +1084,6 @@ class BridgeEvent_AudioRouteChanged extends BridgeEvent {
|
||||
const BridgeEvent_AudioRouteChanged({required this.route}): super._();
|
||||
|
||||
|
||||
/// The new audio route.
|
||||
final BridgeAudioRoute route;
|
||||
|
||||
/// Create a copy of BridgeEvent
|
||||
@@ -1176,6 +1141,512 @@ as BridgeAudioRoute,
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
|
||||
|
||||
class BridgeEvent_ClientMoved extends BridgeEvent {
|
||||
const BridgeEvent_ClientMoved({required this.clientId, required this.newChannelId}): super._();
|
||||
|
||||
|
||||
final BigInt clientId;
|
||||
final BigInt newChannelId;
|
||||
|
||||
/// Create a copy of BridgeEvent
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
@pragma('vm:prefer-inline')
|
||||
$BridgeEvent_ClientMovedCopyWith<BridgeEvent_ClientMoved> get copyWith => _$BridgeEvent_ClientMovedCopyWithImpl<BridgeEvent_ClientMoved>(this, _$identity);
|
||||
|
||||
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return identical(this, other) || (other.runtimeType == runtimeType&&other is BridgeEvent_ClientMoved&&(identical(other.clientId, clientId) || other.clientId == clientId)&&(identical(other.newChannelId, newChannelId) || other.newChannelId == newChannelId));
|
||||
}
|
||||
|
||||
|
||||
@override
|
||||
int get hashCode => Object.hash(runtimeType,clientId,newChannelId);
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'BridgeEvent.clientMoved(clientId: $clientId, newChannelId: $newChannelId)';
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
abstract mixin class $BridgeEvent_ClientMovedCopyWith<$Res> implements $BridgeEventCopyWith<$Res> {
|
||||
factory $BridgeEvent_ClientMovedCopyWith(BridgeEvent_ClientMoved value, $Res Function(BridgeEvent_ClientMoved) _then) = _$BridgeEvent_ClientMovedCopyWithImpl;
|
||||
@useResult
|
||||
$Res call({
|
||||
BigInt clientId, BigInt newChannelId
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
/// @nodoc
|
||||
class _$BridgeEvent_ClientMovedCopyWithImpl<$Res>
|
||||
implements $BridgeEvent_ClientMovedCopyWith<$Res> {
|
||||
_$BridgeEvent_ClientMovedCopyWithImpl(this._self, this._then);
|
||||
|
||||
final BridgeEvent_ClientMoved _self;
|
||||
final $Res Function(BridgeEvent_ClientMoved) _then;
|
||||
|
||||
/// Create a copy of BridgeEvent
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@pragma('vm:prefer-inline') $Res call({Object? clientId = null,Object? newChannelId = null,}) {
|
||||
return _then(BridgeEvent_ClientMoved(
|
||||
clientId: null == clientId ? _self.clientId : clientId // ignore: cast_nullable_to_non_nullable
|
||||
as BigInt,newChannelId: null == newChannelId ? _self.newChannelId : newChannelId // ignore: cast_nullable_to_non_nullable
|
||||
as BigInt,
|
||||
));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
|
||||
|
||||
class BridgeEvent_ClientJoined extends BridgeEvent {
|
||||
const BridgeEvent_ClientJoined({required this.clientId, required this.channelId, required this.name, required this.inputMuted, required this.outputMuted, required this.isServerQuery, required this.talkPower, required this.talkPowerGranted}): super._();
|
||||
|
||||
|
||||
final BigInt clientId;
|
||||
final BigInt channelId;
|
||||
final String name;
|
||||
final bool inputMuted;
|
||||
final bool outputMuted;
|
||||
final bool isServerQuery;
|
||||
final int talkPower;
|
||||
final bool talkPowerGranted;
|
||||
|
||||
/// Create a copy of BridgeEvent
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
@pragma('vm:prefer-inline')
|
||||
$BridgeEvent_ClientJoinedCopyWith<BridgeEvent_ClientJoined> get copyWith => _$BridgeEvent_ClientJoinedCopyWithImpl<BridgeEvent_ClientJoined>(this, _$identity);
|
||||
|
||||
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return identical(this, other) || (other.runtimeType == runtimeType&&other is BridgeEvent_ClientJoined&&(identical(other.clientId, clientId) || other.clientId == clientId)&&(identical(other.channelId, channelId) || other.channelId == channelId)&&(identical(other.name, name) || other.name == name)&&(identical(other.inputMuted, inputMuted) || other.inputMuted == inputMuted)&&(identical(other.outputMuted, outputMuted) || other.outputMuted == outputMuted)&&(identical(other.isServerQuery, isServerQuery) || other.isServerQuery == isServerQuery)&&(identical(other.talkPower, talkPower) || other.talkPower == talkPower)&&(identical(other.talkPowerGranted, talkPowerGranted) || other.talkPowerGranted == talkPowerGranted));
|
||||
}
|
||||
|
||||
|
||||
@override
|
||||
int get hashCode => Object.hash(runtimeType,clientId,channelId,name,inputMuted,outputMuted,isServerQuery,talkPower,talkPowerGranted);
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'BridgeEvent.clientJoined(clientId: $clientId, channelId: $channelId, name: $name, inputMuted: $inputMuted, outputMuted: $outputMuted, isServerQuery: $isServerQuery, talkPower: $talkPower, talkPowerGranted: $talkPowerGranted)';
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
abstract mixin class $BridgeEvent_ClientJoinedCopyWith<$Res> implements $BridgeEventCopyWith<$Res> {
|
||||
factory $BridgeEvent_ClientJoinedCopyWith(BridgeEvent_ClientJoined value, $Res Function(BridgeEvent_ClientJoined) _then) = _$BridgeEvent_ClientJoinedCopyWithImpl;
|
||||
@useResult
|
||||
$Res call({
|
||||
BigInt clientId, BigInt channelId, String name, bool inputMuted, bool outputMuted, bool isServerQuery, int talkPower, bool talkPowerGranted
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
/// @nodoc
|
||||
class _$BridgeEvent_ClientJoinedCopyWithImpl<$Res>
|
||||
implements $BridgeEvent_ClientJoinedCopyWith<$Res> {
|
||||
_$BridgeEvent_ClientJoinedCopyWithImpl(this._self, this._then);
|
||||
|
||||
final BridgeEvent_ClientJoined _self;
|
||||
final $Res Function(BridgeEvent_ClientJoined) _then;
|
||||
|
||||
/// Create a copy of BridgeEvent
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@pragma('vm:prefer-inline') $Res call({Object? clientId = null,Object? channelId = null,Object? name = null,Object? inputMuted = null,Object? outputMuted = null,Object? isServerQuery = null,Object? talkPower = null,Object? talkPowerGranted = null,}) {
|
||||
return _then(BridgeEvent_ClientJoined(
|
||||
clientId: null == clientId ? _self.clientId : clientId // ignore: cast_nullable_to_non_nullable
|
||||
as BigInt,channelId: null == channelId ? _self.channelId : channelId // ignore: cast_nullable_to_non_nullable
|
||||
as BigInt,name: null == name ? _self.name : name // ignore: cast_nullable_to_non_nullable
|
||||
as String,inputMuted: null == inputMuted ? _self.inputMuted : inputMuted // ignore: cast_nullable_to_non_nullable
|
||||
as bool,outputMuted: null == outputMuted ? _self.outputMuted : outputMuted // ignore: cast_nullable_to_non_nullable
|
||||
as bool,isServerQuery: null == isServerQuery ? _self.isServerQuery : isServerQuery // ignore: cast_nullable_to_non_nullable
|
||||
as bool,talkPower: null == talkPower ? _self.talkPower : talkPower // ignore: cast_nullable_to_non_nullable
|
||||
as int,talkPowerGranted: null == talkPowerGranted ? _self.talkPowerGranted : talkPowerGranted // ignore: cast_nullable_to_non_nullable
|
||||
as bool,
|
||||
));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
|
||||
|
||||
class BridgeEvent_ClientLeft extends BridgeEvent {
|
||||
const BridgeEvent_ClientLeft({required this.clientId, required this.name}): super._();
|
||||
|
||||
|
||||
final BigInt clientId;
|
||||
final String name;
|
||||
|
||||
/// Create a copy of BridgeEvent
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
@pragma('vm:prefer-inline')
|
||||
$BridgeEvent_ClientLeftCopyWith<BridgeEvent_ClientLeft> get copyWith => _$BridgeEvent_ClientLeftCopyWithImpl<BridgeEvent_ClientLeft>(this, _$identity);
|
||||
|
||||
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return identical(this, other) || (other.runtimeType == runtimeType&&other is BridgeEvent_ClientLeft&&(identical(other.clientId, clientId) || other.clientId == clientId)&&(identical(other.name, name) || other.name == name));
|
||||
}
|
||||
|
||||
|
||||
@override
|
||||
int get hashCode => Object.hash(runtimeType,clientId,name);
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'BridgeEvent.clientLeft(clientId: $clientId, name: $name)';
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
abstract mixin class $BridgeEvent_ClientLeftCopyWith<$Res> implements $BridgeEventCopyWith<$Res> {
|
||||
factory $BridgeEvent_ClientLeftCopyWith(BridgeEvent_ClientLeft value, $Res Function(BridgeEvent_ClientLeft) _then) = _$BridgeEvent_ClientLeftCopyWithImpl;
|
||||
@useResult
|
||||
$Res call({
|
||||
BigInt clientId, String name
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
/// @nodoc
|
||||
class _$BridgeEvent_ClientLeftCopyWithImpl<$Res>
|
||||
implements $BridgeEvent_ClientLeftCopyWith<$Res> {
|
||||
_$BridgeEvent_ClientLeftCopyWithImpl(this._self, this._then);
|
||||
|
||||
final BridgeEvent_ClientLeft _self;
|
||||
final $Res Function(BridgeEvent_ClientLeft) _then;
|
||||
|
||||
/// Create a copy of BridgeEvent
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@pragma('vm:prefer-inline') $Res call({Object? clientId = null,Object? name = null,}) {
|
||||
return _then(BridgeEvent_ClientLeft(
|
||||
clientId: null == clientId ? _self.clientId : clientId // ignore: cast_nullable_to_non_nullable
|
||||
as BigInt,name: null == name ? _self.name : name // ignore: cast_nullable_to_non_nullable
|
||||
as String,
|
||||
));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
|
||||
|
||||
class BridgeEvent_ClientUpdated extends BridgeEvent {
|
||||
const BridgeEvent_ClientUpdated({required this.clientId, required this.inputMuted, required this.outputMuted, required this.isServerQuery, required this.talkPower, required this.talkPowerGranted}): super._();
|
||||
|
||||
|
||||
final BigInt clientId;
|
||||
final bool inputMuted;
|
||||
final bool outputMuted;
|
||||
final bool isServerQuery;
|
||||
final int talkPower;
|
||||
final bool talkPowerGranted;
|
||||
|
||||
/// Create a copy of BridgeEvent
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
@pragma('vm:prefer-inline')
|
||||
$BridgeEvent_ClientUpdatedCopyWith<BridgeEvent_ClientUpdated> get copyWith => _$BridgeEvent_ClientUpdatedCopyWithImpl<BridgeEvent_ClientUpdated>(this, _$identity);
|
||||
|
||||
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return identical(this, other) || (other.runtimeType == runtimeType&&other is BridgeEvent_ClientUpdated&&(identical(other.clientId, clientId) || other.clientId == clientId)&&(identical(other.inputMuted, inputMuted) || other.inputMuted == inputMuted)&&(identical(other.outputMuted, outputMuted) || other.outputMuted == outputMuted)&&(identical(other.isServerQuery, isServerQuery) || other.isServerQuery == isServerQuery)&&(identical(other.talkPower, talkPower) || other.talkPower == talkPower)&&(identical(other.talkPowerGranted, talkPowerGranted) || other.talkPowerGranted == talkPowerGranted));
|
||||
}
|
||||
|
||||
|
||||
@override
|
||||
int get hashCode => Object.hash(runtimeType,clientId,inputMuted,outputMuted,isServerQuery,talkPower,talkPowerGranted);
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'BridgeEvent.clientUpdated(clientId: $clientId, inputMuted: $inputMuted, outputMuted: $outputMuted, isServerQuery: $isServerQuery, talkPower: $talkPower, talkPowerGranted: $talkPowerGranted)';
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
abstract mixin class $BridgeEvent_ClientUpdatedCopyWith<$Res> implements $BridgeEventCopyWith<$Res> {
|
||||
factory $BridgeEvent_ClientUpdatedCopyWith(BridgeEvent_ClientUpdated value, $Res Function(BridgeEvent_ClientUpdated) _then) = _$BridgeEvent_ClientUpdatedCopyWithImpl;
|
||||
@useResult
|
||||
$Res call({
|
||||
BigInt clientId, bool inputMuted, bool outputMuted, bool isServerQuery, int talkPower, bool talkPowerGranted
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
/// @nodoc
|
||||
class _$BridgeEvent_ClientUpdatedCopyWithImpl<$Res>
|
||||
implements $BridgeEvent_ClientUpdatedCopyWith<$Res> {
|
||||
_$BridgeEvent_ClientUpdatedCopyWithImpl(this._self, this._then);
|
||||
|
||||
final BridgeEvent_ClientUpdated _self;
|
||||
final $Res Function(BridgeEvent_ClientUpdated) _then;
|
||||
|
||||
/// Create a copy of BridgeEvent
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@pragma('vm:prefer-inline') $Res call({Object? clientId = null,Object? inputMuted = null,Object? outputMuted = null,Object? isServerQuery = null,Object? talkPower = null,Object? talkPowerGranted = null,}) {
|
||||
return _then(BridgeEvent_ClientUpdated(
|
||||
clientId: null == clientId ? _self.clientId : clientId // ignore: cast_nullable_to_non_nullable
|
||||
as BigInt,inputMuted: null == inputMuted ? _self.inputMuted : inputMuted // ignore: cast_nullable_to_non_nullable
|
||||
as bool,outputMuted: null == outputMuted ? _self.outputMuted : outputMuted // ignore: cast_nullable_to_non_nullable
|
||||
as bool,isServerQuery: null == isServerQuery ? _self.isServerQuery : isServerQuery // ignore: cast_nullable_to_non_nullable
|
||||
as bool,talkPower: null == talkPower ? _self.talkPower : talkPower // ignore: cast_nullable_to_non_nullable
|
||||
as int,talkPowerGranted: null == talkPowerGranted ? _self.talkPowerGranted : talkPowerGranted // ignore: cast_nullable_to_non_nullable
|
||||
as bool,
|
||||
));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
|
||||
|
||||
class BridgeEvent_ChannelAdded extends BridgeEvent {
|
||||
const BridgeEvent_ChannelAdded({required this.id, required this.parent, required this.name, required this.order, required this.hasPassword, this.neededTalkPower}): super._();
|
||||
|
||||
|
||||
final BigInt id;
|
||||
final BigInt parent;
|
||||
final String name;
|
||||
final PlatformInt64 order;
|
||||
final bool hasPassword;
|
||||
final int? neededTalkPower;
|
||||
|
||||
/// Create a copy of BridgeEvent
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
@pragma('vm:prefer-inline')
|
||||
$BridgeEvent_ChannelAddedCopyWith<BridgeEvent_ChannelAdded> get copyWith => _$BridgeEvent_ChannelAddedCopyWithImpl<BridgeEvent_ChannelAdded>(this, _$identity);
|
||||
|
||||
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return identical(this, other) || (other.runtimeType == runtimeType&&other is BridgeEvent_ChannelAdded&&(identical(other.id, id) || other.id == id)&&(identical(other.parent, parent) || other.parent == parent)&&(identical(other.name, name) || other.name == name)&&(identical(other.order, order) || other.order == order)&&(identical(other.hasPassword, hasPassword) || other.hasPassword == hasPassword)&&(identical(other.neededTalkPower, neededTalkPower) || other.neededTalkPower == neededTalkPower));
|
||||
}
|
||||
|
||||
|
||||
@override
|
||||
int get hashCode => Object.hash(runtimeType,id,parent,name,order,hasPassword,neededTalkPower);
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'BridgeEvent.channelAdded(id: $id, parent: $parent, name: $name, order: $order, hasPassword: $hasPassword, neededTalkPower: $neededTalkPower)';
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
abstract mixin class $BridgeEvent_ChannelAddedCopyWith<$Res> implements $BridgeEventCopyWith<$Res> {
|
||||
factory $BridgeEvent_ChannelAddedCopyWith(BridgeEvent_ChannelAdded value, $Res Function(BridgeEvent_ChannelAdded) _then) = _$BridgeEvent_ChannelAddedCopyWithImpl;
|
||||
@useResult
|
||||
$Res call({
|
||||
BigInt id, BigInt parent, String name, PlatformInt64 order, bool hasPassword, int? neededTalkPower
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
/// @nodoc
|
||||
class _$BridgeEvent_ChannelAddedCopyWithImpl<$Res>
|
||||
implements $BridgeEvent_ChannelAddedCopyWith<$Res> {
|
||||
_$BridgeEvent_ChannelAddedCopyWithImpl(this._self, this._then);
|
||||
|
||||
final BridgeEvent_ChannelAdded _self;
|
||||
final $Res Function(BridgeEvent_ChannelAdded) _then;
|
||||
|
||||
/// Create a copy of BridgeEvent
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@pragma('vm:prefer-inline') $Res call({Object? id = null,Object? parent = null,Object? name = null,Object? order = null,Object? hasPassword = null,Object? neededTalkPower = freezed,}) {
|
||||
return _then(BridgeEvent_ChannelAdded(
|
||||
id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable
|
||||
as BigInt,parent: null == parent ? _self.parent : parent // ignore: cast_nullable_to_non_nullable
|
||||
as BigInt,name: null == name ? _self.name : name // ignore: cast_nullable_to_non_nullable
|
||||
as String,order: null == order ? _self.order : order // ignore: cast_nullable_to_non_nullable
|
||||
as PlatformInt64,hasPassword: null == hasPassword ? _self.hasPassword : hasPassword // ignore: cast_nullable_to_non_nullable
|
||||
as bool,neededTalkPower: freezed == neededTalkPower ? _self.neededTalkPower : neededTalkPower // ignore: cast_nullable_to_non_nullable
|
||||
as int?,
|
||||
));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
|
||||
|
||||
class BridgeEvent_ChannelRemoved extends BridgeEvent {
|
||||
const BridgeEvent_ChannelRemoved({required this.id}): super._();
|
||||
|
||||
|
||||
final BigInt id;
|
||||
|
||||
/// Create a copy of BridgeEvent
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
@pragma('vm:prefer-inline')
|
||||
$BridgeEvent_ChannelRemovedCopyWith<BridgeEvent_ChannelRemoved> get copyWith => _$BridgeEvent_ChannelRemovedCopyWithImpl<BridgeEvent_ChannelRemoved>(this, _$identity);
|
||||
|
||||
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return identical(this, other) || (other.runtimeType == runtimeType&&other is BridgeEvent_ChannelRemoved&&(identical(other.id, id) || other.id == id));
|
||||
}
|
||||
|
||||
|
||||
@override
|
||||
int get hashCode => Object.hash(runtimeType,id);
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'BridgeEvent.channelRemoved(id: $id)';
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
abstract mixin class $BridgeEvent_ChannelRemovedCopyWith<$Res> implements $BridgeEventCopyWith<$Res> {
|
||||
factory $BridgeEvent_ChannelRemovedCopyWith(BridgeEvent_ChannelRemoved value, $Res Function(BridgeEvent_ChannelRemoved) _then) = _$BridgeEvent_ChannelRemovedCopyWithImpl;
|
||||
@useResult
|
||||
$Res call({
|
||||
BigInt id
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
/// @nodoc
|
||||
class _$BridgeEvent_ChannelRemovedCopyWithImpl<$Res>
|
||||
implements $BridgeEvent_ChannelRemovedCopyWith<$Res> {
|
||||
_$BridgeEvent_ChannelRemovedCopyWithImpl(this._self, this._then);
|
||||
|
||||
final BridgeEvent_ChannelRemoved _self;
|
||||
final $Res Function(BridgeEvent_ChannelRemoved) _then;
|
||||
|
||||
/// Create a copy of BridgeEvent
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@pragma('vm:prefer-inline') $Res call({Object? id = null,}) {
|
||||
return _then(BridgeEvent_ChannelRemoved(
|
||||
id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable
|
||||
as BigInt,
|
||||
));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
|
||||
|
||||
class BridgeEvent_ChannelUpdated extends BridgeEvent {
|
||||
const BridgeEvent_ChannelUpdated({required this.id, required this.name, required this.hasPassword, this.neededTalkPower}): super._();
|
||||
|
||||
|
||||
final BigInt id;
|
||||
final String name;
|
||||
final bool hasPassword;
|
||||
final int? neededTalkPower;
|
||||
|
||||
/// Create a copy of BridgeEvent
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||
@pragma('vm:prefer-inline')
|
||||
$BridgeEvent_ChannelUpdatedCopyWith<BridgeEvent_ChannelUpdated> get copyWith => _$BridgeEvent_ChannelUpdatedCopyWithImpl<BridgeEvent_ChannelUpdated>(this, _$identity);
|
||||
|
||||
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return identical(this, other) || (other.runtimeType == runtimeType&&other is BridgeEvent_ChannelUpdated&&(identical(other.id, id) || other.id == id)&&(identical(other.name, name) || other.name == name)&&(identical(other.hasPassword, hasPassword) || other.hasPassword == hasPassword)&&(identical(other.neededTalkPower, neededTalkPower) || other.neededTalkPower == neededTalkPower));
|
||||
}
|
||||
|
||||
|
||||
@override
|
||||
int get hashCode => Object.hash(runtimeType,id,name,hasPassword,neededTalkPower);
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'BridgeEvent.channelUpdated(id: $id, name: $name, hasPassword: $hasPassword, neededTalkPower: $neededTalkPower)';
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
abstract mixin class $BridgeEvent_ChannelUpdatedCopyWith<$Res> implements $BridgeEventCopyWith<$Res> {
|
||||
factory $BridgeEvent_ChannelUpdatedCopyWith(BridgeEvent_ChannelUpdated value, $Res Function(BridgeEvent_ChannelUpdated) _then) = _$BridgeEvent_ChannelUpdatedCopyWithImpl;
|
||||
@useResult
|
||||
$Res call({
|
||||
BigInt id, String name, bool hasPassword, int? neededTalkPower
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
/// @nodoc
|
||||
class _$BridgeEvent_ChannelUpdatedCopyWithImpl<$Res>
|
||||
implements $BridgeEvent_ChannelUpdatedCopyWith<$Res> {
|
||||
_$BridgeEvent_ChannelUpdatedCopyWithImpl(this._self, this._then);
|
||||
|
||||
final BridgeEvent_ChannelUpdated _self;
|
||||
final $Res Function(BridgeEvent_ChannelUpdated) _then;
|
||||
|
||||
/// Create a copy of BridgeEvent
|
||||
/// with the given fields replaced by the non-null parameter values.
|
||||
@pragma('vm:prefer-inline') $Res call({Object? id = null,Object? name = null,Object? hasPassword = null,Object? neededTalkPower = freezed,}) {
|
||||
return _then(BridgeEvent_ChannelUpdated(
|
||||
id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable
|
||||
as BigInt,name: null == name ? _self.name : name // ignore: cast_nullable_to_non_nullable
|
||||
as String,hasPassword: null == hasPassword ? _self.hasPassword : hasPassword // ignore: cast_nullable_to_non_nullable
|
||||
as bool,neededTalkPower: freezed == neededTalkPower ? _self.neededTalkPower : neededTalkPower // ignore: cast_nullable_to_non_nullable
|
||||
as int?,
|
||||
));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
|
||||
@@ -1930,17 +1930,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
|
||||
case 5:
|
||||
return BridgeEvent_AudioStopped();
|
||||
case 6:
|
||||
return BridgeEvent_SnapshotChanged(
|
||||
channels: dco_decode_u_32(raw[1]),
|
||||
clients: dco_decode_u_32(raw[2]),
|
||||
);
|
||||
case 7:
|
||||
return BridgeEvent_PttCapability(
|
||||
level: dco_decode_String(raw[1]),
|
||||
backendId: dco_decode_String(raw[2]),
|
||||
boundInputClass: dco_decode_String(raw[3]),
|
||||
);
|
||||
case 8:
|
||||
case 7:
|
||||
return BridgeEvent_VoiceState(
|
||||
inChannel: dco_decode_bool(raw[1]),
|
||||
transmitMode: dco_decode_bridge_transmit_mode(raw[2]),
|
||||
@@ -1954,29 +1949,77 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
|
||||
joinErrorCode:
|
||||
dco_decode_opt_box_autoadd_bridge_voice_join_error_code(raw[10]),
|
||||
);
|
||||
case 9:
|
||||
case 8:
|
||||
return BridgeEvent_InterruptionState(
|
||||
began: dco_decode_bool(raw[1]),
|
||||
shouldResume: dco_decode_bool(raw[2]),
|
||||
);
|
||||
case 10:
|
||||
case 9:
|
||||
return BridgeEvent_PermissionState(
|
||||
permission: dco_decode_String(raw[1]),
|
||||
state: dco_decode_permission_state_kind(raw[2]),
|
||||
);
|
||||
case 11:
|
||||
case 10:
|
||||
return BridgeEvent_ChatMessage(
|
||||
senderId: dco_decode_u_64(raw[1]),
|
||||
senderName: dco_decode_String(raw[2]),
|
||||
message: dco_decode_String(raw[3]),
|
||||
target: dco_decode_box_autoadd_bridge_message_target(raw[4]),
|
||||
);
|
||||
case 12:
|
||||
case 11:
|
||||
return BridgeEvent_ServerActivity(message: dco_decode_String(raw[1]));
|
||||
case 13:
|
||||
case 12:
|
||||
return BridgeEvent_AudioRouteChanged(
|
||||
route: dco_decode_bridge_audio_route(raw[1]),
|
||||
);
|
||||
case 13:
|
||||
return BridgeEvent_ClientMoved(
|
||||
clientId: dco_decode_u_64(raw[1]),
|
||||
newChannelId: dco_decode_u_64(raw[2]),
|
||||
);
|
||||
case 14:
|
||||
return BridgeEvent_ClientJoined(
|
||||
clientId: dco_decode_u_64(raw[1]),
|
||||
channelId: dco_decode_u_64(raw[2]),
|
||||
name: dco_decode_String(raw[3]),
|
||||
inputMuted: dco_decode_bool(raw[4]),
|
||||
outputMuted: dco_decode_bool(raw[5]),
|
||||
isServerQuery: dco_decode_bool(raw[6]),
|
||||
talkPower: dco_decode_i_32(raw[7]),
|
||||
talkPowerGranted: dco_decode_bool(raw[8]),
|
||||
);
|
||||
case 15:
|
||||
return BridgeEvent_ClientLeft(
|
||||
clientId: dco_decode_u_64(raw[1]),
|
||||
name: dco_decode_String(raw[2]),
|
||||
);
|
||||
case 16:
|
||||
return BridgeEvent_ClientUpdated(
|
||||
clientId: dco_decode_u_64(raw[1]),
|
||||
inputMuted: dco_decode_bool(raw[2]),
|
||||
outputMuted: dco_decode_bool(raw[3]),
|
||||
isServerQuery: dco_decode_bool(raw[4]),
|
||||
talkPower: dco_decode_i_32(raw[5]),
|
||||
talkPowerGranted: dco_decode_bool(raw[6]),
|
||||
);
|
||||
case 17:
|
||||
return BridgeEvent_ChannelAdded(
|
||||
id: dco_decode_u_64(raw[1]),
|
||||
parent: dco_decode_u_64(raw[2]),
|
||||
name: dco_decode_String(raw[3]),
|
||||
order: dco_decode_i_64(raw[4]),
|
||||
hasPassword: dco_decode_bool(raw[5]),
|
||||
neededTalkPower: dco_decode_opt_box_autoadd_i_32(raw[6]),
|
||||
);
|
||||
case 18:
|
||||
return BridgeEvent_ChannelRemoved(id: dco_decode_u_64(raw[1]));
|
||||
case 19:
|
||||
return BridgeEvent_ChannelUpdated(
|
||||
id: dco_decode_u_64(raw[1]),
|
||||
name: dco_decode_String(raw[2]),
|
||||
hasPassword: dco_decode_bool(raw[3]),
|
||||
neededTalkPower: dco_decode_opt_box_autoadd_i_32(raw[4]),
|
||||
);
|
||||
default:
|
||||
throw Exception("unreachable");
|
||||
}
|
||||
@@ -2649,13 +2692,6 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
|
||||
case 5:
|
||||
return BridgeEvent_AudioStopped();
|
||||
case 6:
|
||||
var var_channels = sse_decode_u_32(deserializer);
|
||||
var var_clients = sse_decode_u_32(deserializer);
|
||||
return BridgeEvent_SnapshotChanged(
|
||||
channels: var_channels,
|
||||
clients: var_clients,
|
||||
);
|
||||
case 7:
|
||||
var var_level = sse_decode_String(deserializer);
|
||||
var var_backendId = sse_decode_String(deserializer);
|
||||
var var_boundInputClass = sse_decode_String(deserializer);
|
||||
@@ -2664,7 +2700,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
|
||||
backendId: var_backendId,
|
||||
boundInputClass: var_boundInputClass,
|
||||
);
|
||||
case 8:
|
||||
case 7:
|
||||
var var_inChannel = sse_decode_bool(deserializer);
|
||||
var var_transmitMode = sse_decode_bridge_transmit_mode(deserializer);
|
||||
var var_mute = sse_decode_bool(deserializer);
|
||||
@@ -2696,21 +2732,21 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
|
||||
joinSyncState: var_joinSyncState,
|
||||
joinErrorCode: var_joinErrorCode,
|
||||
);
|
||||
case 9:
|
||||
case 8:
|
||||
var var_began = sse_decode_bool(deserializer);
|
||||
var var_shouldResume = sse_decode_bool(deserializer);
|
||||
return BridgeEvent_InterruptionState(
|
||||
began: var_began,
|
||||
shouldResume: var_shouldResume,
|
||||
);
|
||||
case 10:
|
||||
case 9:
|
||||
var var_permission = sse_decode_String(deserializer);
|
||||
var var_state = sse_decode_permission_state_kind(deserializer);
|
||||
return BridgeEvent_PermissionState(
|
||||
permission: var_permission,
|
||||
state: var_state,
|
||||
);
|
||||
case 11:
|
||||
case 10:
|
||||
var var_senderId = sse_decode_u_64(deserializer);
|
||||
var var_senderName = sse_decode_String(deserializer);
|
||||
var var_message = sse_decode_String(deserializer);
|
||||
@@ -2723,12 +2759,86 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
|
||||
message: var_message,
|
||||
target: var_target,
|
||||
);
|
||||
case 12:
|
||||
case 11:
|
||||
var var_message = sse_decode_String(deserializer);
|
||||
return BridgeEvent_ServerActivity(message: var_message);
|
||||
case 13:
|
||||
case 12:
|
||||
var var_route = sse_decode_bridge_audio_route(deserializer);
|
||||
return BridgeEvent_AudioRouteChanged(route: var_route);
|
||||
case 13:
|
||||
var var_clientId = sse_decode_u_64(deserializer);
|
||||
var var_newChannelId = sse_decode_u_64(deserializer);
|
||||
return BridgeEvent_ClientMoved(
|
||||
clientId: var_clientId,
|
||||
newChannelId: var_newChannelId,
|
||||
);
|
||||
case 14:
|
||||
var var_clientId = sse_decode_u_64(deserializer);
|
||||
var var_channelId = sse_decode_u_64(deserializer);
|
||||
var var_name = sse_decode_String(deserializer);
|
||||
var var_inputMuted = sse_decode_bool(deserializer);
|
||||
var var_outputMuted = sse_decode_bool(deserializer);
|
||||
var var_isServerQuery = sse_decode_bool(deserializer);
|
||||
var var_talkPower = sse_decode_i_32(deserializer);
|
||||
var var_talkPowerGranted = sse_decode_bool(deserializer);
|
||||
return BridgeEvent_ClientJoined(
|
||||
clientId: var_clientId,
|
||||
channelId: var_channelId,
|
||||
name: var_name,
|
||||
inputMuted: var_inputMuted,
|
||||
outputMuted: var_outputMuted,
|
||||
isServerQuery: var_isServerQuery,
|
||||
talkPower: var_talkPower,
|
||||
talkPowerGranted: var_talkPowerGranted,
|
||||
);
|
||||
case 15:
|
||||
var var_clientId = sse_decode_u_64(deserializer);
|
||||
var var_name = sse_decode_String(deserializer);
|
||||
return BridgeEvent_ClientLeft(clientId: var_clientId, name: var_name);
|
||||
case 16:
|
||||
var var_clientId = sse_decode_u_64(deserializer);
|
||||
var var_inputMuted = sse_decode_bool(deserializer);
|
||||
var var_outputMuted = sse_decode_bool(deserializer);
|
||||
var var_isServerQuery = sse_decode_bool(deserializer);
|
||||
var var_talkPower = sse_decode_i_32(deserializer);
|
||||
var var_talkPowerGranted = sse_decode_bool(deserializer);
|
||||
return BridgeEvent_ClientUpdated(
|
||||
clientId: var_clientId,
|
||||
inputMuted: var_inputMuted,
|
||||
outputMuted: var_outputMuted,
|
||||
isServerQuery: var_isServerQuery,
|
||||
talkPower: var_talkPower,
|
||||
talkPowerGranted: var_talkPowerGranted,
|
||||
);
|
||||
case 17:
|
||||
var var_id = sse_decode_u_64(deserializer);
|
||||
var var_parent = sse_decode_u_64(deserializer);
|
||||
var var_name = sse_decode_String(deserializer);
|
||||
var var_order = sse_decode_i_64(deserializer);
|
||||
var var_hasPassword = sse_decode_bool(deserializer);
|
||||
var var_neededTalkPower = sse_decode_opt_box_autoadd_i_32(deserializer);
|
||||
return BridgeEvent_ChannelAdded(
|
||||
id: var_id,
|
||||
parent: var_parent,
|
||||
name: var_name,
|
||||
order: var_order,
|
||||
hasPassword: var_hasPassword,
|
||||
neededTalkPower: var_neededTalkPower,
|
||||
);
|
||||
case 18:
|
||||
var var_id = sse_decode_u_64(deserializer);
|
||||
return BridgeEvent_ChannelRemoved(id: var_id);
|
||||
case 19:
|
||||
var var_id = sse_decode_u_64(deserializer);
|
||||
var var_name = sse_decode_String(deserializer);
|
||||
var var_hasPassword = sse_decode_bool(deserializer);
|
||||
var var_neededTalkPower = sse_decode_opt_box_autoadd_i_32(deserializer);
|
||||
return BridgeEvent_ChannelUpdated(
|
||||
id: var_id,
|
||||
name: var_name,
|
||||
hasPassword: var_hasPassword,
|
||||
neededTalkPower: var_neededTalkPower,
|
||||
);
|
||||
default:
|
||||
throw UnimplementedError('');
|
||||
}
|
||||
@@ -3405,19 +3515,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
|
||||
sse_encode_i_32(4, serializer);
|
||||
case BridgeEvent_AudioStopped():
|
||||
sse_encode_i_32(5, serializer);
|
||||
case BridgeEvent_SnapshotChanged(
|
||||
channels: final channels,
|
||||
clients: final clients,
|
||||
):
|
||||
sse_encode_i_32(6, serializer);
|
||||
sse_encode_u_32(channels, serializer);
|
||||
sse_encode_u_32(clients, serializer);
|
||||
case BridgeEvent_PttCapability(
|
||||
level: final level,
|
||||
backendId: final backendId,
|
||||
boundInputClass: final boundInputClass,
|
||||
):
|
||||
sse_encode_i_32(7, serializer);
|
||||
sse_encode_i_32(6, serializer);
|
||||
sse_encode_String(level, serializer);
|
||||
sse_encode_String(backendId, serializer);
|
||||
sse_encode_String(boundInputClass, serializer);
|
||||
@@ -3433,7 +3536,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
|
||||
joinSyncState: final joinSyncState,
|
||||
joinErrorCode: final joinErrorCode,
|
||||
):
|
||||
sse_encode_i_32(8, serializer);
|
||||
sse_encode_i_32(7, serializer);
|
||||
sse_encode_bool(inChannel, serializer);
|
||||
sse_encode_bridge_transmit_mode(transmitMode, serializer);
|
||||
sse_encode_bool(mute, serializer);
|
||||
@@ -3451,14 +3554,14 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
|
||||
began: final began,
|
||||
shouldResume: final shouldResume,
|
||||
):
|
||||
sse_encode_i_32(9, serializer);
|
||||
sse_encode_i_32(8, serializer);
|
||||
sse_encode_bool(began, serializer);
|
||||
sse_encode_bool(shouldResume, serializer);
|
||||
case BridgeEvent_PermissionState(
|
||||
permission: final permission,
|
||||
state: final state,
|
||||
):
|
||||
sse_encode_i_32(10, serializer);
|
||||
sse_encode_i_32(9, serializer);
|
||||
sse_encode_String(permission, serializer);
|
||||
sse_encode_permission_state_kind(state, serializer);
|
||||
case BridgeEvent_ChatMessage(
|
||||
@@ -3467,17 +3570,91 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
|
||||
message: final message,
|
||||
target: final target,
|
||||
):
|
||||
sse_encode_i_32(11, serializer);
|
||||
sse_encode_i_32(10, serializer);
|
||||
sse_encode_u_64(senderId, serializer);
|
||||
sse_encode_String(senderName, serializer);
|
||||
sse_encode_String(message, serializer);
|
||||
sse_encode_box_autoadd_bridge_message_target(target, serializer);
|
||||
case BridgeEvent_ServerActivity(message: final message):
|
||||
sse_encode_i_32(12, serializer);
|
||||
sse_encode_i_32(11, serializer);
|
||||
sse_encode_String(message, serializer);
|
||||
case BridgeEvent_AudioRouteChanged(route: final route):
|
||||
sse_encode_i_32(13, serializer);
|
||||
sse_encode_i_32(12, serializer);
|
||||
sse_encode_bridge_audio_route(route, serializer);
|
||||
case BridgeEvent_ClientMoved(
|
||||
clientId: final clientId,
|
||||
newChannelId: final newChannelId,
|
||||
):
|
||||
sse_encode_i_32(13, serializer);
|
||||
sse_encode_u_64(clientId, serializer);
|
||||
sse_encode_u_64(newChannelId, serializer);
|
||||
case BridgeEvent_ClientJoined(
|
||||
clientId: final clientId,
|
||||
channelId: final channelId,
|
||||
name: final name,
|
||||
inputMuted: final inputMuted,
|
||||
outputMuted: final outputMuted,
|
||||
isServerQuery: final isServerQuery,
|
||||
talkPower: final talkPower,
|
||||
talkPowerGranted: final talkPowerGranted,
|
||||
):
|
||||
sse_encode_i_32(14, serializer);
|
||||
sse_encode_u_64(clientId, serializer);
|
||||
sse_encode_u_64(channelId, serializer);
|
||||
sse_encode_String(name, serializer);
|
||||
sse_encode_bool(inputMuted, serializer);
|
||||
sse_encode_bool(outputMuted, serializer);
|
||||
sse_encode_bool(isServerQuery, serializer);
|
||||
sse_encode_i_32(talkPower, serializer);
|
||||
sse_encode_bool(talkPowerGranted, serializer);
|
||||
case BridgeEvent_ClientLeft(clientId: final clientId, name: final name):
|
||||
sse_encode_i_32(15, serializer);
|
||||
sse_encode_u_64(clientId, serializer);
|
||||
sse_encode_String(name, serializer);
|
||||
case BridgeEvent_ClientUpdated(
|
||||
clientId: final clientId,
|
||||
inputMuted: final inputMuted,
|
||||
outputMuted: final outputMuted,
|
||||
isServerQuery: final isServerQuery,
|
||||
talkPower: final talkPower,
|
||||
talkPowerGranted: final talkPowerGranted,
|
||||
):
|
||||
sse_encode_i_32(16, serializer);
|
||||
sse_encode_u_64(clientId, serializer);
|
||||
sse_encode_bool(inputMuted, serializer);
|
||||
sse_encode_bool(outputMuted, serializer);
|
||||
sse_encode_bool(isServerQuery, serializer);
|
||||
sse_encode_i_32(talkPower, serializer);
|
||||
sse_encode_bool(talkPowerGranted, serializer);
|
||||
case BridgeEvent_ChannelAdded(
|
||||
id: final id,
|
||||
parent: final parent,
|
||||
name: final name,
|
||||
order: final order,
|
||||
hasPassword: final hasPassword,
|
||||
neededTalkPower: final neededTalkPower,
|
||||
):
|
||||
sse_encode_i_32(17, serializer);
|
||||
sse_encode_u_64(id, serializer);
|
||||
sse_encode_u_64(parent, serializer);
|
||||
sse_encode_String(name, serializer);
|
||||
sse_encode_i_64(order, serializer);
|
||||
sse_encode_bool(hasPassword, serializer);
|
||||
sse_encode_opt_box_autoadd_i_32(neededTalkPower, serializer);
|
||||
case BridgeEvent_ChannelRemoved(id: final id):
|
||||
sse_encode_i_32(18, serializer);
|
||||
sse_encode_u_64(id, serializer);
|
||||
case BridgeEvent_ChannelUpdated(
|
||||
id: final id,
|
||||
name: final name,
|
||||
hasPassword: final hasPassword,
|
||||
neededTalkPower: final neededTalkPower,
|
||||
):
|
||||
sse_encode_i_32(19, serializer);
|
||||
sse_encode_u_64(id, serializer);
|
||||
sse_encode_String(name, serializer);
|
||||
sse_encode_bool(hasPassword, serializer);
|
||||
sse_encode_opt_box_autoadd_i_32(neededTalkPower, serializer);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -457,10 +457,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: meta
|
||||
sha256: "1741988757a65eb6b36abe716829688cf01910bbf91c34354ff7ec1c3de2b349"
|
||||
sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.18.0"
|
||||
version: "1.17.0"
|
||||
mime:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -790,10 +790,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: test_api
|
||||
sha256: "949a932224383300f01be9221c39180316445ecb8e7547f70a41a35bf421fb9e"
|
||||
sha256: "8161c84903fd860b26bfdefb7963b3f0b68fee7adea0f59ef805ecca346f0c7a"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.7.11"
|
||||
version: "0.7.10"
|
||||
typed_data:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
||||
+117
-85
@@ -182,16 +182,6 @@ pub enum SessionEvent {
|
||||
/// Audio engine stopped (e.g. before a reconnect cycle, or by
|
||||
/// explicit user action).
|
||||
AudioStopped,
|
||||
/// A snapshot probe observed a change in channel or client
|
||||
/// counts. Useful for UI auto-refresh without active polling
|
||||
/// from the Dart side. Carries the counts so subscribers can
|
||||
/// decide whether to re-fetch.
|
||||
SnapshotChanged {
|
||||
/// Number of channels in the latest probe snapshot.
|
||||
channels: u32,
|
||||
/// Number of clients in the latest probe snapshot.
|
||||
clients: u32,
|
||||
},
|
||||
/// Detected desktop Push-to-Talk capability (gen2 v0.9.3 /
|
||||
/// DEC-023..028). Published when the audio engine starts or
|
||||
/// when the active backend transitions (for example macOS
|
||||
@@ -263,9 +253,51 @@ pub enum SessionEvent {
|
||||
},
|
||||
/// Audio route changed (speaker/earpiece/BT/wired headset).
|
||||
AudioRouteChanged {
|
||||
/// New audio route.
|
||||
route: AudioRoute,
|
||||
},
|
||||
ClientMoved {
|
||||
client_id: u64,
|
||||
new_channel_id: u64,
|
||||
},
|
||||
ClientJoined {
|
||||
client_id: u64,
|
||||
channel_id: u64,
|
||||
name: String,
|
||||
input_muted: bool,
|
||||
output_muted: bool,
|
||||
is_server_query: bool,
|
||||
talk_power: i32,
|
||||
talk_power_granted: bool,
|
||||
},
|
||||
ClientLeft {
|
||||
client_id: u64,
|
||||
name: String,
|
||||
},
|
||||
ClientUpdated {
|
||||
client_id: u64,
|
||||
input_muted: bool,
|
||||
output_muted: bool,
|
||||
is_server_query: bool,
|
||||
talk_power: i32,
|
||||
talk_power_granted: bool,
|
||||
},
|
||||
ChannelAdded {
|
||||
id: u64,
|
||||
parent: u64,
|
||||
name: String,
|
||||
order: i64,
|
||||
has_password: bool,
|
||||
needed_talk_power: Option<i32>,
|
||||
},
|
||||
ChannelRemoved {
|
||||
id: u64,
|
||||
},
|
||||
ChannelUpdated {
|
||||
id: u64,
|
||||
name: String,
|
||||
has_password: bool,
|
||||
needed_talk_power: Option<i32>,
|
||||
},
|
||||
}
|
||||
|
||||
/// Bridge-safe mirror of channel-join projection sync state.
|
||||
@@ -802,51 +834,7 @@ impl ChanoraSession {
|
||||
}
|
||||
}
|
||||
|
||||
// Forward inbound chat messages from the protocol adapter
|
||||
// to the event broadcast stream. Chat is infrequent (~human
|
||||
// typing rate), so a simple loop with try_recv + yield is fine.
|
||||
if let Some(chat_rx) = client.take_chat_rx() {
|
||||
let ev_tx = self.events_tx.clone();
|
||||
tokio::spawn(async move {
|
||||
use tokio::time::{sleep, Duration};
|
||||
let mut rx = chat_rx;
|
||||
loop {
|
||||
match rx.try_recv() {
|
||||
Ok(msg) => {
|
||||
let _ = ev_tx.send(SessionEvent::ChatMessage {
|
||||
sender_id: msg.sender_id.0,
|
||||
sender_name: msg.sender_name,
|
||||
message: msg.message,
|
||||
target: msg.target,
|
||||
});
|
||||
}
|
||||
Err(tokio::sync::mpsc::error::TryRecvError::Disconnected) => break,
|
||||
Err(tokio::sync::mpsc::error::TryRecvError::Empty) => {
|
||||
sleep(Duration::from_millis(200)).await;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if let Some(activity_rx) = client.take_activity_rx() {
|
||||
let ev_tx = self.events_tx.clone();
|
||||
tokio::spawn(async move {
|
||||
use tokio::time::{sleep, Duration};
|
||||
let mut rx = activity_rx;
|
||||
loop {
|
||||
match rx.try_recv() {
|
||||
Ok(ServerActivity { message }) => {
|
||||
let _ = ev_tx.send(SessionEvent::ServerActivity { message });
|
||||
}
|
||||
Err(tokio::sync::mpsc::error::TryRecvError::Disconnected) => break,
|
||||
Err(tokio::sync::mpsc::error::TryRecvError::Empty) => {
|
||||
sleep(Duration::from_millis(200)).await;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
spawn_event_forwarders(&client, &self.events_tx);
|
||||
|
||||
*guard = Some(ConnectedState {
|
||||
protocol: client,
|
||||
@@ -1925,6 +1913,71 @@ struct SupervisorContext {
|
||||
next_connection_epoch: Arc<Mutex<u64>>,
|
||||
}
|
||||
|
||||
fn spawn_event_forwarders(
|
||||
client: &chanora_protocol::ProtocolClient,
|
||||
events_tx: &broadcast::Sender<SessionEvent>,
|
||||
) {
|
||||
use chanora_protocol::ProtocolDelta;
|
||||
|
||||
if let Some(chat_rx) = client.take_chat_rx() {
|
||||
let ev_tx = events_tx.clone();
|
||||
tokio::spawn(async move {
|
||||
let mut rx = chat_rx;
|
||||
while let Some(msg) = rx.recv().await {
|
||||
let _ = ev_tx.send(SessionEvent::ChatMessage {
|
||||
sender_id: msg.sender_id.0,
|
||||
sender_name: msg.sender_name,
|
||||
message: msg.message,
|
||||
target: msg.target,
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if let Some(activity_rx) = client.take_activity_rx() {
|
||||
let ev_tx = events_tx.clone();
|
||||
tokio::spawn(async move {
|
||||
let mut rx = activity_rx;
|
||||
while let Some(chanora_protocol::ServerActivity { message }) = rx.recv().await {
|
||||
let _ = ev_tx.send(SessionEvent::ServerActivity { message });
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if let Some(delta_rx) = client.take_delta_rx() {
|
||||
let ev_tx = events_tx.clone();
|
||||
tokio::spawn(async move {
|
||||
let mut rx = delta_rx;
|
||||
while let Some(delta) = rx.recv().await {
|
||||
let event = match delta {
|
||||
ProtocolDelta::ClientMoved { client_id, new_channel_id } => {
|
||||
SessionEvent::ClientMoved { client_id, new_channel_id }
|
||||
}
|
||||
ProtocolDelta::ClientJoined { client_id, channel_id, name, input_muted, output_muted, is_server_query, talk_power, talk_power_granted } => {
|
||||
SessionEvent::ClientJoined { client_id, channel_id, name, input_muted, output_muted, is_server_query, talk_power, talk_power_granted }
|
||||
}
|
||||
ProtocolDelta::ClientLeft { client_id, name } => {
|
||||
SessionEvent::ClientLeft { client_id, name }
|
||||
}
|
||||
ProtocolDelta::ClientUpdated { client_id, input_muted, output_muted, is_server_query, talk_power, talk_power_granted } => {
|
||||
SessionEvent::ClientUpdated { client_id, input_muted, output_muted, is_server_query, talk_power, talk_power_granted }
|
||||
}
|
||||
ProtocolDelta::ChannelAdded { id, parent, name, order, has_password, needed_talk_power } => {
|
||||
SessionEvent::ChannelAdded { id, parent, name, order, has_password, needed_talk_power }
|
||||
}
|
||||
ProtocolDelta::ChannelRemoved { id } => {
|
||||
SessionEvent::ChannelRemoved { id }
|
||||
}
|
||||
ProtocolDelta::ChannelUpdated { id, name, has_password, needed_talk_power } => {
|
||||
SessionEvent::ChannelUpdated { id, name, has_password, needed_talk_power }
|
||||
}
|
||||
};
|
||||
let _ = ev_tx.send(event);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
async fn supervisor_loop(ctx: SupervisorContext) {
|
||||
let SupervisorContext {
|
||||
state_arc,
|
||||
@@ -1945,13 +1998,6 @@ async fn supervisor_loop(ctx: SupervisorContext) {
|
||||
let mut lost_rx = initial_lost_rx;
|
||||
let mut probe = initial_probe;
|
||||
let mut cfg = initial_cfg;
|
||||
// Stable content hash of the last snapshot observed by the
|
||||
// watchdog. Used to emit `SessionEvent::SnapshotChanged`
|
||||
// whenever the channel or client list mutates in any way —
|
||||
// count, ordering, names, or per-client channel membership.
|
||||
// Stored as a u64 so the comparison is cheap and the field
|
||||
// doesn't grow with the snapshot.
|
||||
let mut last_signature: Option<u64> = None;
|
||||
|
||||
loop {
|
||||
// Watch the current connection: race the protocol task's
|
||||
@@ -2018,7 +2064,7 @@ async fn supervisor_loop(ctx: SupervisorContext) {
|
||||
}
|
||||
_ = watchdog.tick() => {
|
||||
match tokio::time::timeout(WATCHDOG_PROBE_TIMEOUT, probe.probe()).await {
|
||||
Ok(Ok(snap)) => {
|
||||
Ok(Ok(_)) => {
|
||||
if misses > 0 {
|
||||
info!(
|
||||
target: "chanora_core",
|
||||
@@ -2027,24 +2073,6 @@ async fn supervisor_loop(ctx: SupervisorContext) {
|
||||
);
|
||||
}
|
||||
misses = 0;
|
||||
// A.4 / MVP: emit on any tree change.
|
||||
// Hash channels (id, parent, order, name)
|
||||
// and clients (id, channel, name) so
|
||||
// in-channel moves and renames surface
|
||||
// alongside count changes.
|
||||
let sig = snapshot_signature(&snap);
|
||||
if last_signature != Some(sig) {
|
||||
last_signature = Some(sig);
|
||||
let _ = events_tx.send(SessionEvent::SnapshotChanged {
|
||||
channels: snap.channels.len() as u32,
|
||||
clients: snap.clients.len() as u32,
|
||||
});
|
||||
// Record protocol event (SRS-097).
|
||||
event_recorder.lock().await.record_snapshot_changed(
|
||||
snap.channels.len(),
|
||||
snap.clients.len(),
|
||||
);
|
||||
}
|
||||
}
|
||||
Ok(Err(e)) => {
|
||||
misses = misses.saturating_add(1);
|
||||
@@ -2264,6 +2292,13 @@ async fn supervisor_loop(ctx: SupervisorContext) {
|
||||
server_name: snap_name,
|
||||
});
|
||||
|
||||
{
|
||||
let guard = state_arc.lock().await;
|
||||
if let Some(state) = guard.as_ref() {
|
||||
spawn_event_forwarders(&state.protocol, &events_tx);
|
||||
}
|
||||
}
|
||||
|
||||
// Optionally restart audio.
|
||||
if restart_audio {
|
||||
let audio_cfg = {
|
||||
@@ -2341,9 +2376,6 @@ async fn supervisor_loop(ctx: SupervisorContext) {
|
||||
// Loop back to waiting for the next loss.
|
||||
lost_rx = new_lost_rx;
|
||||
probe = new_probe;
|
||||
// Force re-emission of SnapshotChanged
|
||||
// for the freshly reconnected session.
|
||||
last_signature = None;
|
||||
break;
|
||||
}
|
||||
Err(e) => {
|
||||
|
||||
@@ -1612,15 +1612,6 @@ pub enum BridgeEvent {
|
||||
AudioStarted,
|
||||
/// Audio engine stopped.
|
||||
AudioStopped,
|
||||
/// Snapshot probe observed a change in channel/client counts.
|
||||
/// UI uses this to drive an auto-refresh without active
|
||||
/// polling.
|
||||
SnapshotChanged {
|
||||
/// Latest channel count.
|
||||
channels: u32,
|
||||
/// Latest client count.
|
||||
clients: u32,
|
||||
},
|
||||
/// Detected desktop Push-to-Talk capability (gen2 v0.9.3,
|
||||
/// DEC-023..028). The fields carry only privacy-safe values per
|
||||
/// DEC-027: the capability level, a stable backend identifier,
|
||||
@@ -1707,9 +1698,51 @@ pub enum BridgeEvent {
|
||||
},
|
||||
/// Audio route changed (speaker/earpiece/BT/wired).
|
||||
AudioRouteChanged {
|
||||
/// The new audio route.
|
||||
route: BridgeAudioRoute,
|
||||
},
|
||||
ClientMoved {
|
||||
client_id: u64,
|
||||
new_channel_id: u64,
|
||||
},
|
||||
ClientJoined {
|
||||
client_id: u64,
|
||||
channel_id: u64,
|
||||
name: String,
|
||||
input_muted: bool,
|
||||
output_muted: bool,
|
||||
is_server_query: bool,
|
||||
talk_power: i32,
|
||||
talk_power_granted: bool,
|
||||
},
|
||||
ClientLeft {
|
||||
client_id: u64,
|
||||
name: String,
|
||||
},
|
||||
ClientUpdated {
|
||||
client_id: u64,
|
||||
input_muted: bool,
|
||||
output_muted: bool,
|
||||
is_server_query: bool,
|
||||
talk_power: i32,
|
||||
talk_power_granted: bool,
|
||||
},
|
||||
ChannelAdded {
|
||||
id: u64,
|
||||
parent: u64,
|
||||
name: String,
|
||||
order: i64,
|
||||
has_password: bool,
|
||||
needed_talk_power: Option<i32>,
|
||||
},
|
||||
ChannelRemoved {
|
||||
id: u64,
|
||||
},
|
||||
ChannelUpdated {
|
||||
id: u64,
|
||||
name: String,
|
||||
has_password: bool,
|
||||
needed_talk_power: Option<i32>,
|
||||
},
|
||||
}
|
||||
|
||||
/// Bridge message target scope.
|
||||
@@ -1838,9 +1871,6 @@ impl From<chanora_core::SessionEvent> for BridgeEvent {
|
||||
}
|
||||
chanora_core::SessionEvent::AudioStarted => BridgeEvent::AudioStarted,
|
||||
chanora_core::SessionEvent::AudioStopped => BridgeEvent::AudioStopped,
|
||||
chanora_core::SessionEvent::SnapshotChanged { channels, clients } => {
|
||||
BridgeEvent::SnapshotChanged { channels, clients }
|
||||
}
|
||||
chanora_core::SessionEvent::PttCapability {
|
||||
level,
|
||||
backend_id,
|
||||
@@ -1899,6 +1929,27 @@ impl From<chanora_core::SessionEvent> for BridgeEvent {
|
||||
route: route.into(),
|
||||
}
|
||||
}
|
||||
chanora_core::SessionEvent::ClientMoved { client_id, new_channel_id } => {
|
||||
BridgeEvent::ClientMoved { client_id, new_channel_id }
|
||||
}
|
||||
chanora_core::SessionEvent::ClientJoined { client_id, channel_id, name, input_muted, output_muted, is_server_query, talk_power, talk_power_granted } => {
|
||||
BridgeEvent::ClientJoined { client_id, channel_id, name, input_muted, output_muted, is_server_query, talk_power, talk_power_granted }
|
||||
}
|
||||
chanora_core::SessionEvent::ClientLeft { client_id, name } => {
|
||||
BridgeEvent::ClientLeft { client_id, name }
|
||||
}
|
||||
chanora_core::SessionEvent::ClientUpdated { client_id, input_muted, output_muted, is_server_query, talk_power, talk_power_granted } => {
|
||||
BridgeEvent::ClientUpdated { client_id, input_muted, output_muted, is_server_query, talk_power, talk_power_granted }
|
||||
}
|
||||
chanora_core::SessionEvent::ChannelAdded { id, parent, name, order, has_password, needed_talk_power } => {
|
||||
BridgeEvent::ChannelAdded { id, parent, name, order, has_password, needed_talk_power }
|
||||
}
|
||||
chanora_core::SessionEvent::ChannelRemoved { id } => {
|
||||
BridgeEvent::ChannelRemoved { id }
|
||||
}
|
||||
chanora_core::SessionEvent::ChannelUpdated { id, name, has_password, needed_talk_power } => {
|
||||
BridgeEvent::ChannelUpdated { id, name, has_password, needed_talk_power }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2187,14 +2187,6 @@ impl SseDecode for crate::api::BridgeEvent {
|
||||
return crate::api::BridgeEvent::AudioStopped;
|
||||
}
|
||||
6 => {
|
||||
let mut var_channels = <u32>::sse_decode(deserializer);
|
||||
let mut var_clients = <u32>::sse_decode(deserializer);
|
||||
return crate::api::BridgeEvent::SnapshotChanged {
|
||||
channels: var_channels,
|
||||
clients: var_clients,
|
||||
};
|
||||
}
|
||||
7 => {
|
||||
let mut var_level = <String>::sse_decode(deserializer);
|
||||
let mut var_backendId = <String>::sse_decode(deserializer);
|
||||
let mut var_boundInputClass = <String>::sse_decode(deserializer);
|
||||
@@ -2204,7 +2196,7 @@ impl SseDecode for crate::api::BridgeEvent {
|
||||
bound_input_class: var_boundInputClass,
|
||||
};
|
||||
}
|
||||
8 => {
|
||||
7 => {
|
||||
let mut var_inChannel = <bool>::sse_decode(deserializer);
|
||||
let mut var_transmitMode =
|
||||
<crate::api::BridgeTransmitMode>::sse_decode(deserializer);
|
||||
@@ -2231,7 +2223,7 @@ impl SseDecode for crate::api::BridgeEvent {
|
||||
join_error_code: var_joinErrorCode,
|
||||
};
|
||||
}
|
||||
9 => {
|
||||
8 => {
|
||||
let mut var_began = <bool>::sse_decode(deserializer);
|
||||
let mut var_shouldResume = <bool>::sse_decode(deserializer);
|
||||
return crate::api::BridgeEvent::InterruptionState {
|
||||
@@ -2239,7 +2231,7 @@ impl SseDecode for crate::api::BridgeEvent {
|
||||
should_resume: var_shouldResume,
|
||||
};
|
||||
}
|
||||
10 => {
|
||||
9 => {
|
||||
let mut var_permission = <String>::sse_decode(deserializer);
|
||||
let mut var_state = <crate::api::PermissionStateKind>::sse_decode(deserializer);
|
||||
return crate::api::BridgeEvent::PermissionState {
|
||||
@@ -2247,7 +2239,7 @@ impl SseDecode for crate::api::BridgeEvent {
|
||||
state: var_state,
|
||||
};
|
||||
}
|
||||
11 => {
|
||||
10 => {
|
||||
let mut var_senderId = <u64>::sse_decode(deserializer);
|
||||
let mut var_senderName = <String>::sse_decode(deserializer);
|
||||
let mut var_message = <String>::sse_decode(deserializer);
|
||||
@@ -2259,16 +2251,100 @@ impl SseDecode for crate::api::BridgeEvent {
|
||||
target: var_target,
|
||||
};
|
||||
}
|
||||
12 => {
|
||||
11 => {
|
||||
let mut var_message = <String>::sse_decode(deserializer);
|
||||
return crate::api::BridgeEvent::ServerActivity {
|
||||
message: var_message,
|
||||
};
|
||||
}
|
||||
13 => {
|
||||
12 => {
|
||||
let mut var_route = <crate::api::BridgeAudioRoute>::sse_decode(deserializer);
|
||||
return crate::api::BridgeEvent::AudioRouteChanged { route: var_route };
|
||||
}
|
||||
13 => {
|
||||
let mut var_clientId = <u64>::sse_decode(deserializer);
|
||||
let mut var_newChannelId = <u64>::sse_decode(deserializer);
|
||||
return crate::api::BridgeEvent::ClientMoved {
|
||||
client_id: var_clientId,
|
||||
new_channel_id: var_newChannelId,
|
||||
};
|
||||
}
|
||||
14 => {
|
||||
let mut var_clientId = <u64>::sse_decode(deserializer);
|
||||
let mut var_channelId = <u64>::sse_decode(deserializer);
|
||||
let mut var_name = <String>::sse_decode(deserializer);
|
||||
let mut var_inputMuted = <bool>::sse_decode(deserializer);
|
||||
let mut var_outputMuted = <bool>::sse_decode(deserializer);
|
||||
let mut var_isServerQuery = <bool>::sse_decode(deserializer);
|
||||
let mut var_talkPower = <i32>::sse_decode(deserializer);
|
||||
let mut var_talkPowerGranted = <bool>::sse_decode(deserializer);
|
||||
return crate::api::BridgeEvent::ClientJoined {
|
||||
client_id: var_clientId,
|
||||
channel_id: var_channelId,
|
||||
name: var_name,
|
||||
input_muted: var_inputMuted,
|
||||
output_muted: var_outputMuted,
|
||||
is_server_query: var_isServerQuery,
|
||||
talk_power: var_talkPower,
|
||||
talk_power_granted: var_talkPowerGranted,
|
||||
};
|
||||
}
|
||||
15 => {
|
||||
let mut var_clientId = <u64>::sse_decode(deserializer);
|
||||
let mut var_name = <String>::sse_decode(deserializer);
|
||||
return crate::api::BridgeEvent::ClientLeft {
|
||||
client_id: var_clientId,
|
||||
name: var_name,
|
||||
};
|
||||
}
|
||||
16 => {
|
||||
let mut var_clientId = <u64>::sse_decode(deserializer);
|
||||
let mut var_inputMuted = <bool>::sse_decode(deserializer);
|
||||
let mut var_outputMuted = <bool>::sse_decode(deserializer);
|
||||
let mut var_isServerQuery = <bool>::sse_decode(deserializer);
|
||||
let mut var_talkPower = <i32>::sse_decode(deserializer);
|
||||
let mut var_talkPowerGranted = <bool>::sse_decode(deserializer);
|
||||
return crate::api::BridgeEvent::ClientUpdated {
|
||||
client_id: var_clientId,
|
||||
input_muted: var_inputMuted,
|
||||
output_muted: var_outputMuted,
|
||||
is_server_query: var_isServerQuery,
|
||||
talk_power: var_talkPower,
|
||||
talk_power_granted: var_talkPowerGranted,
|
||||
};
|
||||
}
|
||||
17 => {
|
||||
let mut var_id = <u64>::sse_decode(deserializer);
|
||||
let mut var_parent = <u64>::sse_decode(deserializer);
|
||||
let mut var_name = <String>::sse_decode(deserializer);
|
||||
let mut var_order = <i64>::sse_decode(deserializer);
|
||||
let mut var_hasPassword = <bool>::sse_decode(deserializer);
|
||||
let mut var_neededTalkPower = <Option<i32>>::sse_decode(deserializer);
|
||||
return crate::api::BridgeEvent::ChannelAdded {
|
||||
id: var_id,
|
||||
parent: var_parent,
|
||||
name: var_name,
|
||||
order: var_order,
|
||||
has_password: var_hasPassword,
|
||||
needed_talk_power: var_neededTalkPower,
|
||||
};
|
||||
}
|
||||
18 => {
|
||||
let mut var_id = <u64>::sse_decode(deserializer);
|
||||
return crate::api::BridgeEvent::ChannelRemoved { id: var_id };
|
||||
}
|
||||
19 => {
|
||||
let mut var_id = <u64>::sse_decode(deserializer);
|
||||
let mut var_name = <String>::sse_decode(deserializer);
|
||||
let mut var_hasPassword = <bool>::sse_decode(deserializer);
|
||||
let mut var_neededTalkPower = <Option<i32>>::sse_decode(deserializer);
|
||||
return crate::api::BridgeEvent::ChannelUpdated {
|
||||
id: var_id,
|
||||
name: var_name,
|
||||
has_password: var_hasPassword,
|
||||
needed_talk_power: var_neededTalkPower,
|
||||
};
|
||||
}
|
||||
_ => {
|
||||
unimplemented!("");
|
||||
}
|
||||
@@ -3114,18 +3190,12 @@ impl flutter_rust_bridge::IntoDart for crate::api::BridgeEvent {
|
||||
}
|
||||
crate::api::BridgeEvent::AudioStarted => [4.into_dart()].into_dart(),
|
||||
crate::api::BridgeEvent::AudioStopped => [5.into_dart()].into_dart(),
|
||||
crate::api::BridgeEvent::SnapshotChanged { channels, clients } => [
|
||||
6.into_dart(),
|
||||
channels.into_into_dart().into_dart(),
|
||||
clients.into_into_dart().into_dart(),
|
||||
]
|
||||
.into_dart(),
|
||||
crate::api::BridgeEvent::PttCapability {
|
||||
level,
|
||||
backend_id,
|
||||
bound_input_class,
|
||||
} => [
|
||||
7.into_dart(),
|
||||
6.into_dart(),
|
||||
level.into_into_dart().into_dart(),
|
||||
backend_id.into_into_dart().into_dart(),
|
||||
bound_input_class.into_into_dart().into_dart(),
|
||||
@@ -3143,7 +3213,7 @@ impl flutter_rust_bridge::IntoDart for crate::api::BridgeEvent {
|
||||
join_sync_state,
|
||||
join_error_code,
|
||||
} => [
|
||||
8.into_dart(),
|
||||
7.into_dart(),
|
||||
in_channel.into_into_dart().into_dart(),
|
||||
transmit_mode.into_into_dart().into_dart(),
|
||||
mute.into_into_dart().into_dart(),
|
||||
@@ -3160,13 +3230,13 @@ impl flutter_rust_bridge::IntoDart for crate::api::BridgeEvent {
|
||||
began,
|
||||
should_resume,
|
||||
} => [
|
||||
9.into_dart(),
|
||||
8.into_dart(),
|
||||
began.into_into_dart().into_dart(),
|
||||
should_resume.into_into_dart().into_dart(),
|
||||
]
|
||||
.into_dart(),
|
||||
crate::api::BridgeEvent::PermissionState { permission, state } => [
|
||||
10.into_dart(),
|
||||
9.into_dart(),
|
||||
permission.into_into_dart().into_dart(),
|
||||
state.into_into_dart().into_dart(),
|
||||
]
|
||||
@@ -3177,7 +3247,7 @@ impl flutter_rust_bridge::IntoDart for crate::api::BridgeEvent {
|
||||
message,
|
||||
target,
|
||||
} => [
|
||||
11.into_dart(),
|
||||
10.into_dart(),
|
||||
sender_id.into_into_dart().into_dart(),
|
||||
sender_name.into_into_dart().into_dart(),
|
||||
message.into_into_dart().into_dart(),
|
||||
@@ -3185,11 +3255,97 @@ impl flutter_rust_bridge::IntoDart for crate::api::BridgeEvent {
|
||||
]
|
||||
.into_dart(),
|
||||
crate::api::BridgeEvent::ServerActivity { message } => {
|
||||
[12.into_dart(), message.into_into_dart().into_dart()].into_dart()
|
||||
[11.into_dart(), message.into_into_dart().into_dart()].into_dart()
|
||||
}
|
||||
crate::api::BridgeEvent::AudioRouteChanged { route } => {
|
||||
[13.into_dart(), route.into_into_dart().into_dart()].into_dart()
|
||||
[12.into_dart(), route.into_into_dart().into_dart()].into_dart()
|
||||
}
|
||||
crate::api::BridgeEvent::ClientMoved {
|
||||
client_id,
|
||||
new_channel_id,
|
||||
} => [
|
||||
13.into_dart(),
|
||||
client_id.into_into_dart().into_dart(),
|
||||
new_channel_id.into_into_dart().into_dart(),
|
||||
]
|
||||
.into_dart(),
|
||||
crate::api::BridgeEvent::ClientJoined {
|
||||
client_id,
|
||||
channel_id,
|
||||
name,
|
||||
input_muted,
|
||||
output_muted,
|
||||
is_server_query,
|
||||
talk_power,
|
||||
talk_power_granted,
|
||||
} => [
|
||||
14.into_dart(),
|
||||
client_id.into_into_dart().into_dart(),
|
||||
channel_id.into_into_dart().into_dart(),
|
||||
name.into_into_dart().into_dart(),
|
||||
input_muted.into_into_dart().into_dart(),
|
||||
output_muted.into_into_dart().into_dart(),
|
||||
is_server_query.into_into_dart().into_dart(),
|
||||
talk_power.into_into_dart().into_dart(),
|
||||
talk_power_granted.into_into_dart().into_dart(),
|
||||
]
|
||||
.into_dart(),
|
||||
crate::api::BridgeEvent::ClientLeft { client_id, name } => [
|
||||
15.into_dart(),
|
||||
client_id.into_into_dart().into_dart(),
|
||||
name.into_into_dart().into_dart(),
|
||||
]
|
||||
.into_dart(),
|
||||
crate::api::BridgeEvent::ClientUpdated {
|
||||
client_id,
|
||||
input_muted,
|
||||
output_muted,
|
||||
is_server_query,
|
||||
talk_power,
|
||||
talk_power_granted,
|
||||
} => [
|
||||
16.into_dart(),
|
||||
client_id.into_into_dart().into_dart(),
|
||||
input_muted.into_into_dart().into_dart(),
|
||||
output_muted.into_into_dart().into_dart(),
|
||||
is_server_query.into_into_dart().into_dart(),
|
||||
talk_power.into_into_dart().into_dart(),
|
||||
talk_power_granted.into_into_dart().into_dart(),
|
||||
]
|
||||
.into_dart(),
|
||||
crate::api::BridgeEvent::ChannelAdded {
|
||||
id,
|
||||
parent,
|
||||
name,
|
||||
order,
|
||||
has_password,
|
||||
needed_talk_power,
|
||||
} => [
|
||||
17.into_dart(),
|
||||
id.into_into_dart().into_dart(),
|
||||
parent.into_into_dart().into_dart(),
|
||||
name.into_into_dart().into_dart(),
|
||||
order.into_into_dart().into_dart(),
|
||||
has_password.into_into_dart().into_dart(),
|
||||
needed_talk_power.into_into_dart().into_dart(),
|
||||
]
|
||||
.into_dart(),
|
||||
crate::api::BridgeEvent::ChannelRemoved { id } => {
|
||||
[18.into_dart(), id.into_into_dart().into_dart()].into_dart()
|
||||
}
|
||||
crate::api::BridgeEvent::ChannelUpdated {
|
||||
id,
|
||||
name,
|
||||
has_password,
|
||||
needed_talk_power,
|
||||
} => [
|
||||
19.into_dart(),
|
||||
id.into_into_dart().into_dart(),
|
||||
name.into_into_dart().into_dart(),
|
||||
has_password.into_into_dart().into_dart(),
|
||||
needed_talk_power.into_into_dart().into_dart(),
|
||||
]
|
||||
.into_dart(),
|
||||
_ => {
|
||||
unimplemented!("");
|
||||
}
|
||||
@@ -3780,17 +3936,12 @@ impl SseEncode for crate::api::BridgeEvent {
|
||||
crate::api::BridgeEvent::AudioStopped => {
|
||||
<i32>::sse_encode(5, serializer);
|
||||
}
|
||||
crate::api::BridgeEvent::SnapshotChanged { channels, clients } => {
|
||||
<i32>::sse_encode(6, serializer);
|
||||
<u32>::sse_encode(channels, serializer);
|
||||
<u32>::sse_encode(clients, serializer);
|
||||
}
|
||||
crate::api::BridgeEvent::PttCapability {
|
||||
level,
|
||||
backend_id,
|
||||
bound_input_class,
|
||||
} => {
|
||||
<i32>::sse_encode(7, serializer);
|
||||
<i32>::sse_encode(6, serializer);
|
||||
<String>::sse_encode(level, serializer);
|
||||
<String>::sse_encode(backend_id, serializer);
|
||||
<String>::sse_encode(bound_input_class, serializer);
|
||||
@@ -3807,7 +3958,7 @@ impl SseEncode for crate::api::BridgeEvent {
|
||||
join_sync_state,
|
||||
join_error_code,
|
||||
} => {
|
||||
<i32>::sse_encode(8, serializer);
|
||||
<i32>::sse_encode(7, serializer);
|
||||
<bool>::sse_encode(in_channel, serializer);
|
||||
<crate::api::BridgeTransmitMode>::sse_encode(transmit_mode, serializer);
|
||||
<bool>::sse_encode(mute, serializer);
|
||||
@@ -3826,12 +3977,12 @@ impl SseEncode for crate::api::BridgeEvent {
|
||||
began,
|
||||
should_resume,
|
||||
} => {
|
||||
<i32>::sse_encode(9, serializer);
|
||||
<i32>::sse_encode(8, serializer);
|
||||
<bool>::sse_encode(began, serializer);
|
||||
<bool>::sse_encode(should_resume, serializer);
|
||||
}
|
||||
crate::api::BridgeEvent::PermissionState { permission, state } => {
|
||||
<i32>::sse_encode(10, serializer);
|
||||
<i32>::sse_encode(9, serializer);
|
||||
<String>::sse_encode(permission, serializer);
|
||||
<crate::api::PermissionStateKind>::sse_encode(state, serializer);
|
||||
}
|
||||
@@ -3841,20 +3992,101 @@ impl SseEncode for crate::api::BridgeEvent {
|
||||
message,
|
||||
target,
|
||||
} => {
|
||||
<i32>::sse_encode(11, serializer);
|
||||
<i32>::sse_encode(10, serializer);
|
||||
<u64>::sse_encode(sender_id, serializer);
|
||||
<String>::sse_encode(sender_name, serializer);
|
||||
<String>::sse_encode(message, serializer);
|
||||
<crate::api::BridgeMessageTarget>::sse_encode(target, serializer);
|
||||
}
|
||||
crate::api::BridgeEvent::ServerActivity { message } => {
|
||||
<i32>::sse_encode(12, serializer);
|
||||
<i32>::sse_encode(11, serializer);
|
||||
<String>::sse_encode(message, serializer);
|
||||
}
|
||||
crate::api::BridgeEvent::AudioRouteChanged { route } => {
|
||||
<i32>::sse_encode(13, serializer);
|
||||
<i32>::sse_encode(12, serializer);
|
||||
<crate::api::BridgeAudioRoute>::sse_encode(route, serializer);
|
||||
}
|
||||
crate::api::BridgeEvent::ClientMoved {
|
||||
client_id,
|
||||
new_channel_id,
|
||||
} => {
|
||||
<i32>::sse_encode(13, serializer);
|
||||
<u64>::sse_encode(client_id, serializer);
|
||||
<u64>::sse_encode(new_channel_id, serializer);
|
||||
}
|
||||
crate::api::BridgeEvent::ClientJoined {
|
||||
client_id,
|
||||
channel_id,
|
||||
name,
|
||||
input_muted,
|
||||
output_muted,
|
||||
is_server_query,
|
||||
talk_power,
|
||||
talk_power_granted,
|
||||
} => {
|
||||
<i32>::sse_encode(14, serializer);
|
||||
<u64>::sse_encode(client_id, serializer);
|
||||
<u64>::sse_encode(channel_id, serializer);
|
||||
<String>::sse_encode(name, serializer);
|
||||
<bool>::sse_encode(input_muted, serializer);
|
||||
<bool>::sse_encode(output_muted, serializer);
|
||||
<bool>::sse_encode(is_server_query, serializer);
|
||||
<i32>::sse_encode(talk_power, serializer);
|
||||
<bool>::sse_encode(talk_power_granted, serializer);
|
||||
}
|
||||
crate::api::BridgeEvent::ClientLeft { client_id, name } => {
|
||||
<i32>::sse_encode(15, serializer);
|
||||
<u64>::sse_encode(client_id, serializer);
|
||||
<String>::sse_encode(name, serializer);
|
||||
}
|
||||
crate::api::BridgeEvent::ClientUpdated {
|
||||
client_id,
|
||||
input_muted,
|
||||
output_muted,
|
||||
is_server_query,
|
||||
talk_power,
|
||||
talk_power_granted,
|
||||
} => {
|
||||
<i32>::sse_encode(16, serializer);
|
||||
<u64>::sse_encode(client_id, serializer);
|
||||
<bool>::sse_encode(input_muted, serializer);
|
||||
<bool>::sse_encode(output_muted, serializer);
|
||||
<bool>::sse_encode(is_server_query, serializer);
|
||||
<i32>::sse_encode(talk_power, serializer);
|
||||
<bool>::sse_encode(talk_power_granted, serializer);
|
||||
}
|
||||
crate::api::BridgeEvent::ChannelAdded {
|
||||
id,
|
||||
parent,
|
||||
name,
|
||||
order,
|
||||
has_password,
|
||||
needed_talk_power,
|
||||
} => {
|
||||
<i32>::sse_encode(17, serializer);
|
||||
<u64>::sse_encode(id, serializer);
|
||||
<u64>::sse_encode(parent, serializer);
|
||||
<String>::sse_encode(name, serializer);
|
||||
<i64>::sse_encode(order, serializer);
|
||||
<bool>::sse_encode(has_password, serializer);
|
||||
<Option<i32>>::sse_encode(needed_talk_power, serializer);
|
||||
}
|
||||
crate::api::BridgeEvent::ChannelRemoved { id } => {
|
||||
<i32>::sse_encode(18, serializer);
|
||||
<u64>::sse_encode(id, serializer);
|
||||
}
|
||||
crate::api::BridgeEvent::ChannelUpdated {
|
||||
id,
|
||||
name,
|
||||
has_password,
|
||||
needed_talk_power,
|
||||
} => {
|
||||
<i32>::sse_encode(19, serializer);
|
||||
<u64>::sse_encode(id, serializer);
|
||||
<String>::sse_encode(name, serializer);
|
||||
<bool>::sse_encode(has_password, serializer);
|
||||
<Option<i32>>::sse_encode(needed_talk_power, serializer);
|
||||
}
|
||||
_ => {
|
||||
unimplemented!("");
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ use tsproto_types::ClientType;
|
||||
|
||||
use crate::dto::{
|
||||
ChannelId, ChannelInfo, ChatMessage, ClientId, ClientInfo, ClientProfile, MessageTarget,
|
||||
ServerActivity, ServerSnapshot,
|
||||
ProtocolDelta, ServerActivity, ServerSnapshot,
|
||||
};
|
||||
use crate::ProtocolError;
|
||||
|
||||
@@ -88,38 +88,7 @@ async fn send_with_timeout<T: Send>(
|
||||
/// `Version` enum at compile time; if upstream rotates the CSV the
|
||||
/// build will fail loudly here rather than silently fall back.
|
||||
fn pick_client_version() -> Version {
|
||||
#[cfg(target_os = "windows")]
|
||||
{
|
||||
Version::Windows_5_0_0_beta51
|
||||
}
|
||||
#[cfg(target_os = "macos")]
|
||||
{
|
||||
Version::macOS_5_0_0_beta51
|
||||
}
|
||||
#[cfg(target_os = "ios")]
|
||||
{
|
||||
Version::iOS_3_5_6
|
||||
}
|
||||
#[cfg(target_os = "android")]
|
||||
{
|
||||
Version::Android_3_5_0__7
|
||||
}
|
||||
#[cfg(target_os = "linux")]
|
||||
{
|
||||
Version::Linux_5_0_0_beta51
|
||||
}
|
||||
#[cfg(not(any(
|
||||
target_os = "windows",
|
||||
target_os = "macos",
|
||||
target_os = "ios",
|
||||
target_os = "android",
|
||||
target_os = "linux"
|
||||
)))]
|
||||
{
|
||||
// Last-ditch fallback for unanticipated targets (BSDs,
|
||||
// Solaris-likes). Linux signature is the closest analogue.
|
||||
Version::Linux_5_0_0_beta51
|
||||
}
|
||||
Version::Windows_3_X_X__1
|
||||
}
|
||||
|
||||
/// Typed configuration for a connection attempt.
|
||||
@@ -229,6 +198,8 @@ pub struct ProtocolClient {
|
||||
chat_rx: std::sync::Mutex<Option<mpsc::Receiver<ChatMessage>>>,
|
||||
/// Inbound server-activity stream from the connection task.
|
||||
activity_rx: std::sync::Mutex<Option<mpsc::Receiver<ServerActivity>>>,
|
||||
/// Inbound state-delta stream from the connection task.
|
||||
delta_rx: std::sync::Mutex<Option<mpsc::Receiver<ProtocolDelta>>>,
|
||||
}
|
||||
|
||||
/// One inbound voice packet from a remote client.
|
||||
@@ -289,6 +260,7 @@ impl ProtocolClient {
|
||||
let (voice_in_tx, voice_in_rx) = mpsc::channel::<InboundVoice>(64);
|
||||
let (chat_tx, chat_rx) = mpsc::channel::<ChatMessage>(64);
|
||||
let (activity_tx, activity_rx) = mpsc::channel::<ServerActivity>(128);
|
||||
let (delta_tx, delta_rx) = mpsc::channel::<ProtocolDelta>(256);
|
||||
let (ready_tx, ready_rx) = oneshot::channel::<Result<(), ProtocolError>>();
|
||||
let (lost_tx, lost_rx) = oneshot::channel::<DisconnectReason>();
|
||||
|
||||
@@ -299,6 +271,7 @@ impl ProtocolClient {
|
||||
voice_in_tx,
|
||||
chat_tx,
|
||||
activity_tx,
|
||||
delta_tx,
|
||||
ready_tx,
|
||||
lost_tx,
|
||||
));
|
||||
@@ -311,6 +284,7 @@ impl ProtocolClient {
|
||||
lost_rx: std::sync::Mutex::new(Some(lost_rx)),
|
||||
chat_rx: std::sync::Mutex::new(Some(chat_rx)),
|
||||
activity_rx: std::sync::Mutex::new(Some(activity_rx)),
|
||||
delta_rx: std::sync::Mutex::new(Some(delta_rx)),
|
||||
}),
|
||||
Ok(Ok(Err(e))) => Err(e),
|
||||
Ok(Err(_)) => Err(ProtocolError::Backend(
|
||||
@@ -487,6 +461,10 @@ impl ProtocolClient {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn take_delta_rx(&self) -> Option<mpsc::Receiver<ProtocolDelta>> {
|
||||
self.delta_rx.lock().ok().and_then(|mut g| g.take())
|
||||
}
|
||||
|
||||
/// Send a text message to the specified target.
|
||||
pub async fn send_text_message(
|
||||
&self,
|
||||
@@ -514,6 +492,7 @@ async fn connection_task(
|
||||
voice_in_tx: mpsc::Sender<InboundVoice>,
|
||||
chat_tx: mpsc::Sender<ChatMessage>,
|
||||
activity_tx: mpsc::Sender<ServerActivity>,
|
||||
delta_tx: mpsc::Sender<ProtocolDelta>,
|
||||
ready_tx: oneshot::Sender<Result<(), ProtocolError>>,
|
||||
lost_tx: oneshot::Sender<DisconnectReason>,
|
||||
) {
|
||||
@@ -742,6 +721,14 @@ async fn connection_task(
|
||||
} = &ev
|
||||
{
|
||||
let own_client = con.get_state().ok().map(|state| state.own_client);
|
||||
if let Some(state) = con.get_state().ok() {
|
||||
if let Some(client) = state.clients.get(client_id) {
|
||||
let _ = delta_tx.try_send(ProtocolDelta::ClientMoved {
|
||||
client_id: client_id.0 as u64,
|
||||
new_channel_id: client.channel.0,
|
||||
});
|
||||
}
|
||||
}
|
||||
if own_client == Some(*client_id) {
|
||||
let current_channel = con.get_state().ok().and_then(|state| {
|
||||
state.clients.get(client_id).map(|client| client.channel.0)
|
||||
@@ -779,6 +766,8 @@ async fn connection_task(
|
||||
let _ = activity_tx.try_send(ServerActivity { message: activity });
|
||||
}
|
||||
|
||||
forward_delta(&con, &ev, &delta_tx);
|
||||
|
||||
if let tsclientlib::events::Event::Message {
|
||||
target,
|
||||
invoker,
|
||||
@@ -1931,3 +1920,110 @@ mod tests {
|
||||
assert_eq!(result, Err(SendTimeoutError::Timeout(2)));
|
||||
}
|
||||
}
|
||||
|
||||
fn forward_delta(
|
||||
con: &Connection,
|
||||
ev: &tsclientlib::events::Event,
|
||||
delta_tx: &mpsc::Sender<ProtocolDelta>,
|
||||
) {
|
||||
use ts_bookkeeping::events::{Event, PropertyId, PropertyValue};
|
||||
|
||||
match ev {
|
||||
Event::PropertyAdded {
|
||||
id: PropertyId::Client(client_id),
|
||||
..
|
||||
} => {
|
||||
if let Some(state) = con.get_state().ok() {
|
||||
if let Some(client) = state.clients.get(client_id) {
|
||||
let _ = delta_tx.try_send(ProtocolDelta::ClientJoined {
|
||||
client_id: client_id.0 as u64,
|
||||
channel_id: client.channel.0,
|
||||
name: client.name.clone(),
|
||||
input_muted: client.input_muted,
|
||||
output_muted: client.output_muted || client.output_only_muted,
|
||||
is_server_query: is_server_query_client_type(&client.client_type),
|
||||
talk_power: client.talk_power,
|
||||
talk_power_granted: client.talk_power_granted,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
Event::PropertyRemoved {
|
||||
id: PropertyId::Client(_),
|
||||
old,
|
||||
..
|
||||
} => {
|
||||
if let PropertyValue::Client(client) = old {
|
||||
let _ = delta_tx.try_send(ProtocolDelta::ClientLeft {
|
||||
client_id: client.id.0 as u64,
|
||||
name: client.name.clone(),
|
||||
});
|
||||
}
|
||||
}
|
||||
Event::PropertyChanged {
|
||||
id: PropertyId::ClientChannel(_),
|
||||
..
|
||||
} => {}
|
||||
Event::PropertyChanged {
|
||||
id: PropertyId::Client(client_id),
|
||||
..
|
||||
} => {
|
||||
if let Some(state) = con.get_state().ok() {
|
||||
if let Some(client) = state.clients.get(client_id) {
|
||||
let _ = delta_tx.try_send(ProtocolDelta::ClientUpdated {
|
||||
client_id: client_id.0 as u64,
|
||||
input_muted: client.input_muted,
|
||||
output_muted: client.output_muted || client.output_only_muted,
|
||||
is_server_query: is_server_query_client_type(&client.client_type),
|
||||
talk_power: client.talk_power,
|
||||
talk_power_granted: client.talk_power_granted,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
Event::PropertyAdded {
|
||||
id: PropertyId::Channel(channel_id),
|
||||
..
|
||||
} => {
|
||||
if let Some(state) = con.get_state().ok() {
|
||||
if let Some(channel) = state.channels.get(channel_id) {
|
||||
let _ = delta_tx.try_send(ProtocolDelta::ChannelAdded {
|
||||
id: channel_id.0,
|
||||
parent: channel.parent.0,
|
||||
name: channel.name.clone(),
|
||||
order: channel.order.0 as i64,
|
||||
has_password: channel.has_password.unwrap_or(false),
|
||||
needed_talk_power: channel.needed_talk_power,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
Event::PropertyRemoved {
|
||||
id: PropertyId::Channel(_),
|
||||
old,
|
||||
..
|
||||
} => {
|
||||
if let PropertyValue::Channel(channel) = old {
|
||||
let _ = delta_tx.try_send(ProtocolDelta::ChannelRemoved {
|
||||
id: channel.id.0,
|
||||
});
|
||||
}
|
||||
}
|
||||
Event::PropertyChanged {
|
||||
id: PropertyId::Channel(channel_id),
|
||||
..
|
||||
} => {
|
||||
if let Some(state) = con.get_state().ok() {
|
||||
if let Some(channel) = state.channels.get(channel_id) {
|
||||
let _ = delta_tx.try_send(ProtocolDelta::ChannelUpdated {
|
||||
id: channel_id.0,
|
||||
name: channel.name.clone(),
|
||||
has_password: channel.has_password.unwrap_or(false),
|
||||
needed_talk_power: channel.needed_talk_power,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -166,7 +166,52 @@ pub struct ServerSnapshot {
|
||||
}
|
||||
|
||||
impl ChannelId {
|
||||
/// The conventional root sentinel used by TeamSpeak-compatible
|
||||
/// servers for the top of the channel tree.
|
||||
pub const ROOT: ChannelId = ChannelId(0);
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||
pub enum ProtocolDelta {
|
||||
ClientMoved {
|
||||
client_id: u64,
|
||||
new_channel_id: u64,
|
||||
},
|
||||
ClientJoined {
|
||||
client_id: u64,
|
||||
channel_id: u64,
|
||||
name: String,
|
||||
input_muted: bool,
|
||||
output_muted: bool,
|
||||
is_server_query: bool,
|
||||
talk_power: i32,
|
||||
talk_power_granted: bool,
|
||||
},
|
||||
ClientLeft {
|
||||
client_id: u64,
|
||||
name: String,
|
||||
},
|
||||
ClientUpdated {
|
||||
client_id: u64,
|
||||
input_muted: bool,
|
||||
output_muted: bool,
|
||||
is_server_query: bool,
|
||||
talk_power: i32,
|
||||
talk_power_granted: bool,
|
||||
},
|
||||
ChannelAdded {
|
||||
id: u64,
|
||||
parent: u64,
|
||||
name: String,
|
||||
order: i64,
|
||||
has_password: bool,
|
||||
needed_talk_power: Option<i32>,
|
||||
},
|
||||
ChannelRemoved {
|
||||
id: u64,
|
||||
},
|
||||
ChannelUpdated {
|
||||
id: u64,
|
||||
name: String,
|
||||
has_password: bool,
|
||||
needed_talk_power: Option<i32>,
|
||||
},
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ mod dto;
|
||||
pub use adapter::{ConnectConfig, DisconnectReason, InboundVoice, ProtocolClient, SnapshotProbe};
|
||||
pub use dto::{
|
||||
ChannelId, ChannelInfo, ChatMessage, ClientId, ClientInfo, ClientProfile, MessageTarget,
|
||||
ServerActivity, ServerSnapshot,
|
||||
ProtocolDelta, ServerActivity, ServerSnapshot,
|
||||
};
|
||||
|
||||
// Re-export the upstream voice types so chanora_audio can build outbound
|
||||
|
||||
@@ -16,7 +16,7 @@ those terms.
|
||||
|
||||
| License | Crate count |
|
||||
|---------|-------------|
|
||||
| `Apache License 2.0` | 330 |
|
||||
| `Apache License 2.0` | 331 |
|
||||
| `MIT License` | 74 |
|
||||
| `Unicode License v3` | 19 |
|
||||
| `BSD 3-Clause "New" or "Revised" License` | 14 |
|
||||
@@ -67,7 +67,7 @@ those terms.
|
||||
| windows_x86_64_msvc | 0.53.1 | `Apache License 2.0` | <https://github.com/microsoft/windows-rs> |
|
||||
| moka | 0.12.15 | `Apache License 2.0` | <https://github.com/moka-rs/moka> |
|
||||
| tinyvec_macros | 0.1.1 | `Apache License 2.0` | <https://github.com/Soveu/tinyvec_macros> |
|
||||
| zerocopy | 0.8.48 | `Apache License 2.0` | <https://github.com/google/zerocopy> |
|
||||
| zerocopy | 0.8.50 | `Apache License 2.0` | <https://github.com/google/zerocopy> |
|
||||
| allo-isolate | 0.1.27 | `Apache License 2.0` | <https://github.com/sunshine-protocol/allo-isolate> |
|
||||
| cpal | 0.17.3 | `Apache License 2.0` | <https://github.com/RustAudio/cpal> |
|
||||
| rustls-platform-verifier | 0.7.0 | `Apache License 2.0` | <https://github.com/rustls/rustls-platform-verifier> |
|
||||
@@ -90,7 +90,7 @@ those terms.
|
||||
| serde_spanned | 1.1.1 | `Apache License 2.0` | <https://github.com/toml-rs/toml> |
|
||||
| toml | 1.1.2+spec-1.1.0 | `Apache License 2.0` | <https://github.com/toml-rs/toml> |
|
||||
| toml_datetime | 1.1.1+spec-1.1.0 | `Apache License 2.0` | <https://github.com/toml-rs/toml> |
|
||||
| toml_edit | 0.25.11+spec-1.1.0 | `Apache License 2.0` | <https://github.com/toml-rs/toml> |
|
||||
| toml_edit | 0.25.12+spec-1.1.0 | `Apache License 2.0` | <https://github.com/toml-rs/toml> |
|
||||
| toml_parser | 1.1.2+spec-1.1.0 | `Apache License 2.0` | <https://github.com/toml-rs/toml> |
|
||||
| toml_writer | 1.1.1+spec-1.1.0 | `Apache License 2.0` | <https://github.com/toml-rs/toml> |
|
||||
| omnom | 3.0.0 | `Apache License 2.0` | <https://github.com/yoshuawuyts/omnom> |
|
||||
@@ -109,10 +109,10 @@ those terms.
|
||||
| futures-task | 0.3.32 | `Apache License 2.0` | <https://github.com/rust-lang/futures-rs> |
|
||||
| futures-util | 0.3.32 | `Apache License 2.0` | <https://github.com/rust-lang/futures-rs> |
|
||||
| futures | 0.3.32 | `Apache License 2.0` | <https://github.com/rust-lang/futures-rs> |
|
||||
| typenum | 1.20.0 | `Apache License 2.0` | <https://github.com/paholg/typenum> |
|
||||
| typenum | 1.20.1 | `Apache License 2.0` | <https://github.com/paholg/typenum> |
|
||||
| reqwest | 0.12.28 | `Apache License 2.0` | <https://github.com/seanmonstar/reqwest> |
|
||||
| reqwest | 0.13.3 | `Apache License 2.0` | <https://github.com/seanmonstar/reqwest> |
|
||||
| http | 1.4.0 | `Apache License 2.0` | <https://github.com/hyperium/http> |
|
||||
| reqwest | 0.13.4 | `Apache License 2.0` | <https://github.com/seanmonstar/reqwest> |
|
||||
| http | 1.4.1 | `Apache License 2.0` | <https://github.com/hyperium/http> |
|
||||
| tokio-rustls | 0.26.4 | `Apache License 2.0` | <https://github.com/rustls/tokio-rustls> |
|
||||
| pin-utils | 0.1.0 | `Apache License 2.0` | <https://github.com/rust-lang-nursery/pin-utils> |
|
||||
| ecdsa | 0.16.9 | `Apache License 2.0` | <https://github.com/RustCrypto/signatures/tree/master/ecdsa> |
|
||||
@@ -123,6 +123,7 @@ those terms.
|
||||
| async-recursion | 1.1.1 | `Apache License 2.0` | <https://github.com/dcchut/async-recursion> |
|
||||
| t4rust-derive | 0.3.1 | `Apache License 2.0` | <https://github.com/ReSpeak/t4rust> |
|
||||
| tsproto-structs | 0.2.0 | `Apache License 2.0` | <https://github.com/ReSpeak/tsclientlib/tree/master/utils/tsproto-structs> |
|
||||
| tsproto-structs | 0.2.0 | `Apache License 2.0` | <https://github.com/ReSpeak/tsclientlib/tree/master/utils/tsproto-structs> |
|
||||
| cmake | 0.1.54 | `Apache License 2.0` | <https://github.com/rust-lang/cmake-rs> |
|
||||
| addr2line | 0.25.1 | `Apache License 2.0` | <https://github.com/gimli-rs/addr2line> |
|
||||
| ahash | 0.8.12 | `Apache License 2.0` | <https://github.com/tkaitchuck/ahash> |
|
||||
@@ -132,8 +133,8 @@ those terms.
|
||||
| backtrace | 0.3.76 | `Apache License 2.0` | <https://github.com/rust-lang/backtrace-rs> |
|
||||
| base64 | 0.22.1 | `Apache License 2.0` | <https://github.com/marshallpierce/rust-base64> |
|
||||
| bitflags | 1.3.2 | `Apache License 2.0` | <https://github.com/bitflags/bitflags> |
|
||||
| bitflags | 2.11.1 | `Apache License 2.0` | <https://github.com/bitflags/bitflags> |
|
||||
| cc | 1.2.62 | `Apache License 2.0` | <https://github.com/rust-lang/cc-rs> |
|
||||
| bitflags | 2.12.1 | `Apache License 2.0` | <https://github.com/bitflags/bitflags> |
|
||||
| cc | 1.2.63 | `Apache License 2.0` | <https://github.com/rust-lang/cc-rs> |
|
||||
| cfg-if | 1.0.4 | `Apache License 2.0` | <https://github.com/rust-lang/cfg-if> |
|
||||
| concurrent-queue | 2.5.0 | `Apache License 2.0` | <https://github.com/smol-rs/concurrent-queue> |
|
||||
| core-foundation-sys | 0.8.7 | `Apache License 2.0` | <https://github.com/servo/core-foundation-rs> |
|
||||
@@ -145,7 +146,7 @@ those terms.
|
||||
| crossbeam-epoch | 0.9.18 | `Apache License 2.0` | <https://github.com/crossbeam-rs/crossbeam> |
|
||||
| crossbeam-utils | 0.8.21 | `Apache License 2.0` | <https://github.com/crossbeam-rs/crossbeam> |
|
||||
| dbus-secret-service | 4.1.0 | `Apache License 2.0` | <https://github.com/brotskydotcom/dbus-secret-service.git> |
|
||||
| displaydoc | 0.2.5 | `Apache License 2.0` | <https://github.com/yaahc/displaydoc> |
|
||||
| displaydoc | 0.2.6 | `Apache License 2.0` | <https://github.com/yaahc/displaydoc> |
|
||||
| either | 1.16.0 | `Apache License 2.0` | <https://github.com/rayon-rs/either> |
|
||||
| equivalent | 1.0.2 | `Apache License 2.0` | <https://github.com/indexmap-rs/equivalent> |
|
||||
| errno | 0.3.14 | `Apache License 2.0` | <https://github.com/lambda-fairy/rust-errno> |
|
||||
@@ -174,7 +175,7 @@ those terms.
|
||||
| lazy_static | 1.5.0 | `Apache License 2.0` | <https://github.com/rust-lang-nursery/lazy-static.rs> |
|
||||
| linux-raw-sys | 0.12.1 | `Apache License 2.0` | <https://github.com/sunfishcode/linux-raw-sys> |
|
||||
| lock_api | 0.4.14 | `Apache License 2.0` | <https://github.com/Amanieu/parking_lot> |
|
||||
| log | 0.4.29 | `Apache License 2.0` | <https://github.com/rust-lang/log> |
|
||||
| log | 0.4.31 | `Apache License 2.0` | <https://github.com/rust-lang/log> |
|
||||
| matrixmultiply | 0.3.10 | `Apache License 2.0` | <https://github.com/bluss/matrixmultiply/> |
|
||||
| mime | 0.3.17 | `Apache License 2.0` | <https://github.com/hyperium/mime> |
|
||||
| ndarray | 0.17.2 | `Apache License 2.0` | <https://github.com/rust-ndarray/ndarray> |
|
||||
@@ -202,7 +203,7 @@ those terms.
|
||||
| rustc-demangle | 0.1.27 | `Apache License 2.0` | <https://github.com/rust-lang/rustc-demangle> |
|
||||
| rustc_version | 0.4.1 | `Apache License 2.0` | <https://github.com/djc/rustc-version-rs> |
|
||||
| rustix | 1.1.4 | `Apache License 2.0` | <https://github.com/bytecodealliance/rustix> |
|
||||
| rustls-native-certs | 0.8.3 | `Apache License 2.0` | <https://github.com/rustls/rustls-native-certs> |
|
||||
| rustls-native-certs | 0.8.4 | `Apache License 2.0` | <https://github.com/rustls/rustls-native-certs> |
|
||||
| rustls | 0.23.40 | `Apache License 2.0` | <https://github.com/rustls/rustls> |
|
||||
| scopeguard | 1.2.0 | `Apache License 2.0` | <https://github.com/bluss/scopeguard> |
|
||||
| security-framework-sys | 2.17.0 | `Apache License 2.0` | <https://github.com/kornelski/rust-security-framework> |
|
||||
@@ -211,7 +212,7 @@ those terms.
|
||||
| signal-hook-registry | 1.4.8 | `Apache License 2.0` | <https://github.com/vorner/signal-hook> |
|
||||
| simd_cesu8 | 1.1.1 | `Apache License 2.0` | <https://github.com/seancroach/simd_cesu8> |
|
||||
| smallvec | 1.15.1 | `Apache License 2.0` | <https://github.com/servo/rust-smallvec> |
|
||||
| socket2 | 0.6.3 | `Apache License 2.0` | <https://github.com/rust-lang/socket2> |
|
||||
| socket2 | 0.6.4 | `Apache License 2.0` | <https://github.com/rust-lang/socket2> |
|
||||
| stable_deref_trait | 1.2.1 | `Apache License 2.0` | <https://github.com/storyyeller/stable_deref_trait> |
|
||||
| system-configuration-sys | 0.6.0 | `Apache License 2.0` | <https://github.com/mullvad/system-configuration-rs> |
|
||||
| system-configuration | 0.7.0 | `Apache License 2.0` | <https://github.com/mullvad/system-configuration-rs> |
|
||||
@@ -220,7 +221,7 @@ those terms.
|
||||
| threadpool | 1.8.1 | `Apache License 2.0` | <https://github.com/rust-threadpool/rust-threadpool> |
|
||||
| unicode-xid | 0.2.6 | `Apache License 2.0` | <https://github.com/unicode-rs/unicode-xid> |
|
||||
| url | 2.5.8 | `Apache License 2.0` | <https://github.com/servo/rust-url> |
|
||||
| uuid | 1.23.1 | `Apache License 2.0` | <https://github.com/uuid-rs/uuid> |
|
||||
| uuid | 1.23.2 | `Apache License 2.0` | <https://github.com/uuid-rs/uuid> |
|
||||
| version_check | 0.9.5 | `Apache License 2.0` | <https://github.com/SergioBenitez/version_check> |
|
||||
| ff | 0.13.1 | `Apache License 2.0` | <https://github.com/zkcrypto/ff> |
|
||||
| hashlink | 0.9.1 | `Apache License 2.0` | <https://github.com/kyren/hashlink> |
|
||||
@@ -283,10 +284,10 @@ those terms.
|
||||
| android_log-sys | 0.2.0 | `Apache License 2.0` | <https://github.com/nercury/android_log-sys-rs> |
|
||||
| android_log-sys | 0.3.2 | `Apache License 2.0` | <https://github.com/rust-mobile/android_log-sys-rs> |
|
||||
| android_logger | 0.15.1 | `Apache License 2.0` | <https://github.com/rust-mobile/android_logger-rs> |
|
||||
| tsproto-types | 0.1.0 | `Apache License 2.0` | <https://github.com/ReSpeak/tsclientlib/tree/master/utils/tsproto-types> |
|
||||
| ts-bookkeeping | 0.1.0 | `Apache License 2.0` | <https://github.com/ReSpeak/tsclientlib/tree/master/utils/ts-bookkeeping> |
|
||||
| tsclientlib | 0.2.0 | `Apache License 2.0` | <https://github.com/ReSpeak/tsclientlib> |
|
||||
| tsproto-packets | 0.1.0 | `Apache License 2.0` | <https://github.com/ReSpeak/tsclientlib/tree/master/utils/tsproto-packets> |
|
||||
| tsproto-types | 0.1.0 | `Apache License 2.0` | <https://github.com/ReSpeak/tsclientlib/tree/master/utils/tsproto-types> |
|
||||
| tsproto | 0.2.0 | `Apache License 2.0` | <https://github.com/ReSpeak/tsclientlib> |
|
||||
| chanora_core | 0.2.0-beta.1 | `Apache License 2.0` | <https://github.com/anomalyco/opencode> |
|
||||
| chanora_audio | 0.2.0-beta.1 | `Apache License 2.0` | <https://github.com/anomalyco/opencode> |
|
||||
@@ -344,7 +345,7 @@ those terms.
|
||||
| serde_json | 1.0.150 | `Apache License 2.0` | <https://github.com/serde-rs/json> |
|
||||
| serde_repr | 0.1.20 | `Apache License 2.0` | <https://github.com/dtolnay/serde-repr> |
|
||||
| serde_urlencoded | 0.7.1 | `Apache License 2.0` | <https://github.com/nox/serde_urlencoded> |
|
||||
| shlex | 1.3.0 | `Apache License 2.0` | <https://github.com/comex/rust-shlex> |
|
||||
| shlex | 2.0.1 | `Apache License 2.0` | <https://github.com/comex/rust-shlex> |
|
||||
| simdutf8 | 0.1.5 | `Apache License 2.0` | <https://github.com/rusticstuff/simdutf8> |
|
||||
| syn | 2.0.117 | `Apache License 2.0` | <https://github.com/dtolnay/syn> |
|
||||
| sync_wrapper | 1.0.2 | `Apache License 2.0` | <https://github.com/Actyx/sync_wrapper> |
|
||||
@@ -385,11 +386,11 @@ those terms.
|
||||
| uds_windows | 1.2.1 | `MIT License` | <https://github.com/haraldh/rust_uds_windows> |
|
||||
| sdl2-sys | 0.37.0 | `MIT License` | <https://github.com/rust-sdl2/rust-sdl2> |
|
||||
| openssl-sys | 0.9.116 | `MIT License` | <https://github.com/rust-openssl/rust-openssl> |
|
||||
| mio | 1.2.0 | `MIT License` | <https://github.com/tokio-rs/mio> |
|
||||
| mio | 1.2.1 | `MIT License` | <https://github.com/tokio-rs/mio> |
|
||||
| nom | 7.1.3 | `MIT License` | <https://github.com/Geal/nom> |
|
||||
| libsqlite3-sys | 0.30.1 | `MIT License` | <https://github.com/rusqlite/rusqlite> |
|
||||
| rusqlite | 0.32.1 | `MIT License` | <https://github.com/rusqlite/rusqlite> |
|
||||
| hyper | 1.9.0 | `MIT License` | <https://github.com/hyperium/hyper> |
|
||||
| hyper | 1.10.1 | `MIT License` | <https://github.com/hyperium/hyper> |
|
||||
| schannel | 0.1.29 | `MIT License` | <https://github.com/steffengy/schannel-rs> |
|
||||
| memoffset | 0.9.1 | `MIT License` | <https://github.com/Gilnaa/memoffset> |
|
||||
| version-compare | 0.1.1 | `MIT License` | <https://gitlab.com/timvisee/version-compare> |
|
||||
@@ -414,11 +415,11 @@ those terms.
|
||||
| http-body-util | 0.1.3 | `MIT License` | <https://github.com/hyperium/http-body> |
|
||||
| delegate-attr | 0.3.0 | `MIT License` | <https://github.com/upsuper/delegate-attr> |
|
||||
| hyper-util | 0.1.20 | `MIT License` | <https://github.com/hyperium/hyper-util> |
|
||||
| zbus | 5.15.0 | `MIT License` | <https://github.com/z-galaxy/zbus/> |
|
||||
| zbus_macros | 5.15.0 | `MIT License` | <https://github.com/z-galaxy/zbus/> |
|
||||
| zbus | 5.16.0 | `MIT License` | <https://github.com/z-galaxy/zbus/> |
|
||||
| zbus_macros | 5.16.0 | `MIT License` | <https://github.com/z-galaxy/zbus/> |
|
||||
| zbus_names | 4.3.2 | `MIT License` | <https://github.com/z-galaxy/zbus/> |
|
||||
| zvariant | 5.11.0 | `MIT License` | <https://github.com/z-galaxy/zbus/> |
|
||||
| zvariant_derive | 5.11.0 | `MIT License` | <https://github.com/z-galaxy/zbus/> |
|
||||
| zvariant | 5.12.0 | `MIT License` | <https://github.com/z-galaxy/zbus/> |
|
||||
| zvariant_derive | 5.12.0 | `MIT License` | <https://github.com/z-galaxy/zbus/> |
|
||||
| synstructure | 0.13.2 | `MIT License` | <https://github.com/mystor/synstructure> |
|
||||
| fs_extra | 1.3.0 | `MIT License` | <https://github.com/webdesus/fs_extra> |
|
||||
| alsa-sys | 0.4.0 | `MIT License` | <https://github.com/diwic/alsa-sys> |
|
||||
@@ -438,14 +439,14 @@ those terms.
|
||||
| tokio | 1.52.3 | `MIT License` | <https://github.com/tokio-rs/tokio> |
|
||||
| endi | 1.1.1 | `MIT License` | <https://github.com/zeenix/endi> |
|
||||
| zmij | 1.0.21 | `MIT License` | <https://github.com/dtolnay/zmij> |
|
||||
| zvariant_utils | 3.3.1 | `MIT License` | <https://github.com/z-galaxy/zbus/> |
|
||||
| zvariant_utils | 3.4.0 | `MIT License` | <https://github.com/z-galaxy/zbus/> |
|
||||
| winnow | 1.0.3 | `MIT License` | <https://github.com/winnow-rs/winnow> |
|
||||
| sdl2 | 0.37.0 | `MIT License` | <https://github.com/Rust-SDL2/rust-sdl2> |
|
||||
| aho-corasick | 1.1.4 | `MIT License` | <https://github.com/BurntSushi/aho-corasick> |
|
||||
| byteorder | 1.5.0 | `MIT License` | <https://github.com/BurntSushi/byteorder> |
|
||||
| csv-core | 0.1.13 | `MIT License` | <https://github.com/BurntSushi/rust-csv> |
|
||||
| csv | 1.4.0 | `MIT License` | <https://github.com/BurntSushi/rust-csv> |
|
||||
| memchr | 2.8.0 | `MIT License` | <https://github.com/BurntSushi/memchr> |
|
||||
| memchr | 2.8.1 | `MIT License` | <https://github.com/BurntSushi/memchr> |
|
||||
| walkdir | 2.5.0 | `MIT License` | <https://github.com/BurntSushi/walkdir> |
|
||||
| combine | 4.6.7 | `MIT License` | <https://github.com/Marwes/combine> |
|
||||
| data-encoding | 2.11.0 | `MIT License` | <https://github.com/ia0/data-encoding> |
|
||||
|
||||
Reference in New Issue
Block a user