rs-netty 1.1.0

A Tokio-native typed TCP/UDP pipeline framework inspired by Netty.
Documentation
# UDP

UDP 使用 datagram pipeline。它的模型和 TCP 相似,但边界是完整 datagram,不是 byte stream。

## Server

`UdpServer::bind(addr)` 创建 socket server builder。`.pipeline(|| ...)` 设置 socket-level pipeline factory:

```rust
use rs_netty::{codec::Utf8DatagramCodec, datagram_pipeline, handler, Result, UdpServer};

struct UdpEcho;

#[handler(UdpEcho)]
async fn udp_echo(msg: String) -> Result<String> {
    Ok(format!("echo: {msg}"))
}

let server = UdpServer::bind("127.0.0.1:0")
    .pipeline(|| {
        datagram_pipeline()
            .codec(Utf8DatagramCodec)
            .handler(UdpEcho)
    })
    .start()
    .await?;

server.shutdown();
server.wait().await?;
# Ok::<(), rs_netty::Error>(())
```

`UdpServerHandle` 提供 `local_addr()`、`shutdown()` 和 `wait()`。

## Client

`UdpClient::connect(remote_addr)` 默认绑定 `"0.0.0.0:0"`。可以用 `.bind(local_addr)` 指定本地地址。`UdpClientHandle<W>` 对默认 remote peer 提供:

- `write(msg)`
- `flush()`
- `write_and_flush(msg)`

也提供显式 peer 版本:

- `write_to(peer_addr, msg)`
- `write_to_and_flush(peer_addr, msg)`

## Socket-Level Pipeline

UDP server 当前只创建一个 socket-level pipeline,不为每个 peer 创建 child pipeline。每个 datagram 处理时都会构造新的 `DatagramInfo`、`InboundContext`、`BusinessContext`、`DatagramContext` 和 `OutboundContext`,其中 `peer_addr()` 是当前 datagram 的来源地址。

如果应用需要 per-peer 状态,请在 handler 中自己维护状态。例如:

```rust
use std::{collections::HashMap, net::SocketAddr};

struct PeerState;

struct StatefulUdp {
    peers: HashMap<SocketAddr, PeerState>,
}
```

## Configuration

UDP 使用 `UdpSocketConfig`:

- `read_buffer_capacity`: 默认 64 KiB,运行前会 normalize 到至少 `max_datagram_size`- `write_buffer_capacity`: 默认 8 KiB。
- `max_datagram_size`: 默认 64 KiB。
- `outbound_queue_size`: 默认 1024。

builder 方法包括:

- `read_buffer_capacity(value)`
- `write_buffer_capacity(value)`
- `max_datagram_size(value)`
- `outbound_queue_size(value)`

UDP 当前没有 TCP 的 `tcp_nodelay`、connection stats 或 idle timeout。

## Datagram Write Semantics

`DatagramContext::write(msg)` 写给当前 datagram peer;`write_to(peer, msg)` 写给显式 peer。两者都只是暂存到 handler-local outbox。`flush` 或 `*_and_flush` 会把 pending datagrams 通过 `send_to` 发出。

UDP 的 flush acknowledgement 只表示本地 `send_to` 已完成,不表示对端收到,也不提供顺序、重传或可靠性保证。