Look at the code for the watcher client[1] and lease management[2].
[1]: https://github.com/etcd-io/etcd/blob/main/client/v3/watch.go
[2]: https://github.com/etcd-io/etcd/blob/main/client/v3/lease.go
[1]: https://github.com/etcd-io/etcd/blob/main/client/v3/watch.go
[2]: https://github.com/etcd-io/etcd/blob/main/client/v3/lease.go
I get that it's difficult to translate this 1:1 into Rust without channels and select primitives, but saying it's complex is wild. Try the server-side code for leases ;)