rs-netty 1.1.0

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

rs-netty 的主路径可以按四层理解:transport、pipeline runtime、stage traits、channel/context。

## Crate Layout

- `src/lib.rs`:公开模块和常用类型 re-export。
- `src/traits.rs``Inbound``Business``Handler``DatagramHandler``Outbound``Flow`- `src/pipeline/stream`:TCP typed builder 和 runtime pipeline。
- `src/pipeline/datagram`:UDP typed builder 和 runtime pipeline。
- `src/pipeline/core`:共享的 `Identity``Then`、stage pipe traits 和 builder state marker。
- `src/codec`:stream/datagram codec traits 和内置 codec。
- `src/context`:stage context、handler context、stats 和 identity 信息。
- `src/channel`:外部写入 handle,以及内部 command enum。
- `src/tls.rs``tls` feature 下的 TLS context builder 和 server/client context。
- `src/transport/tcp`:TCP server、client、connection runtime 和配置。
- `src/transport/udp`:UDP server、client、socket runtime 和配置。
- `src/life.rs`:lifecycle hook trait 和 close reason。
- `rs-netty-macros``#[handler]` attribute macro。

## TCP Runtime Flow

TCP server 每个 accepted connection 都会调用 pipeline factory,创建独立 pipeline 实例。client 可以使用可复用 factory,也可以用 `pipeline_instance` 消耗一个单次 pipeline。

运行时大致流程:

```text
TcpListener / TcpStream
  -> optional TLS accept/connect
  -> read_buf
  -> Decoder::decode
  -> InboundPipe
  -> BusinessPipe
  -> Handler::read(Context<W>, msg)
  -> Context outbox or Channel command queue
  -> OutboundPipe
  -> Encoder::encode
  -> write_buf
  -> flush/write_all
```

`StreamConnectionRuntime` 负责 select socket read、external channel command 和 shutdown signal。没有 idle timeout 时走 no-timeout loop;配置了 `idle_timeout` 时增加一个 read-idle timer。这个 timer 只由 socket read 重置,外部 outbound write 不重置。

## UDP Runtime Flow

UDP server/client 都围绕一个 socket task 运行,pipeline 是 socket-level 的:

```text
UdpSocket::recv_from
  -> DatagramDecoder::decode_datagram
  -> InboundPipe
  -> BusinessPipe
  -> DatagramHandler::read(DatagramContext<W>, msg)
  -> DatagramContext outbox or DatagramChannel command queue
  -> OutboundPipe
  -> DatagramEncoder::encode_datagram
  -> pending_datagrams
  -> flush/send_to
```

UDP server 目前不为每个 peer 创建 child pipeline。需要 per-peer state 时,handler 应自己维护 `HashMap<SocketAddr, State>` 之类的结构。

## Static Stage Composition

builder 在类型层面把 stage 串成 `Then<A, B>`。`Identity` 表示没有该方向的 stage。运行时的 `InboundPipe`、`BusinessPipe` 和 `OutboundPipe` 递归处理 `Then`:

- 前一个 stage 返回 `Flow::Next(value)` 时,继续传给后一个 stage。
- 返回 `Flow::Stop` 时,当前消息方向停止,不视为错误。
- 返回 `Err` 时,连接或 socket runtime 将错误映射为 decode/encode/handler/runtime 错误。

主路径不需要动态 `Box<dyn Handler>` pipeline 分发;pipeline 类型由泛型静态组合出来。

## Channel And Context

`Context<W>` 和 `DatagramContext<W>` 是 final handler 里的写入入口。它们持有 handler-local outbox,适合在同一次 read 内进行多次写入和控制 flush 边界。

`Channel<W>` 和 `DatagramChannel<W>` 是 cloneable external handle。它们通过 bounded Tokio `mpsc` 把命令发送给 connection/socket task。TCP channel 暴露 `stats()`、`capacity()`、`max_capacity()` 和 `is_closed()`;UDP channel 暴露 socket id/local addr 和 queue 状态。