Fixed
- A stream closed or dropped while the client is disconnected releases its
channel. Its UNSUBSCRIBE reached the network task between two reconnection
attempts and, being non-retryable, was failed withDisconnectedByPeer
without the subscription being forgotten. The reconnection then subscribed the
server again to the channel, for a subscriber that no longer existed, and
every latersubscribeto it on the sameClientwas refused with
AlreadySubscribeduntil a message happened to arrive on it. A channel that
stays quiet, like a per-user channel while its user is offline, stayed blocked
for the life of theClient. Such an UNSUBSCRIBE now succeeds without being
sent: a fresh connection is subscribed to nothing, so it has nothing left to
do.PubSubStream::closetherefore returnsOkduring an outage. - A subscription whose stream is gone no longer refuses a new subscriber. A
subscribeto a channel whose previous stream had been dropped was refused
withAlreadySubscribeduntil the server confirmed the UNSUBSCRIBE of that
stream, so a caller that subscribed again right after a drop had to retry. It
now takes the channel over at once. - The crate builds again with warnings denied on Rust 1.99. That toolchain
deprecatesAtomicUsize::fetch_updatein favour oftry_update, which the
1.88 MSRV does not have, so the test-only fault-injection countdown now
decrements through acompare_exchange_weakloop that both accept. Its clippy
also reports#[must_use]onBlockingCommands::monitoras redundant -- an
async fnreturns a future, alreadymust_use-- so the attribute is gone,
with no change to what a caller is warned about.