feat(endpoint): decompose Phase 2 into 9 tasks for alknet-endpoint crate extraction
- endpoint/crate-init: initialize crate, Cargo.toml, module skeleton - endpoint/registry: extract HandlerRegistry (~50 lines) - endpoint/endpoint-core: AlknetEndpoint fresh build against ADR-083 shape - endpoint/dispatch: public dispatch, build_auth_context, ACME guard - endpoint/accept-quinn: quinn accept loop + extractors (extracted) - endpoint/accept-iroh: iroh accept loop + extractors (extracted) - endpoint/accept-tcp-tls: TCP+TLS accept loop (new code) - endpoint/tests: move + adapt 17 tests - endpoint/review-endpoint: review checkpoint 7 generations, 3 parallel tasks (accept loops), no cycles. Depends on tls/review-tls (Phase 1 complete).
This commit is contained in:
1 parent
ae0a0d3985
commit
67d2f4affb
9 files changed
+1439
No files matched your search
@@ -0,0 +1,128 @@
|
||||
---
|
||||
id: endpoint/crate-init
|
||||
name: Initialize alknet-endpoint crate with Cargo.toml, dependencies, and module skeleton
|
||||
status: pending
|
||||
depends_on: [tls/review-tls]
|
||||
scope: moderate
|
||||
risk: low
|
||||
impact: project
|
||||
level: implementation
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
Phase 2, Task 1 of the crate extraction (per `docs/research/alknet-crate-extraction/findings.md`).
|
||||
Initialize the `alknet-endpoint` crate from scratch. This crate provides the server-side
|
||||
multi-transport accept-loop runner — `AlknetEndpoint`, `HandlerRegistry`, and the
|
||||
transport-specific accept loops (quinn, iroh, TCP+TLS).
|
||||
|
||||
The endpoint takes **pre-built transports** via builder methods (`with_quinn`, `with_iroh`,
|
||||
`with_tcp_tls`) — it does not build transports and does not depend on `alknet-tls`. The
|
||||
assembly layer builds transports from `alknet-tls`'s `TlsServerConfig` and hands them to
|
||||
the endpoint. See `docs/architecture/crates/endpoint/README.md` for the full spec.
|
||||
|
||||
### Crate setup
|
||||
|
||||
Create `crates/alknet-endpoint/` with:
|
||||
|
||||
- `Cargo.toml` — package metadata, dependencies, feature flags
|
||||
- `src/lib.rs` — crate root with module declarations and re-exports
|
||||
- Module skeleton files for:
|
||||
- `src/registry.rs` — `HandlerRegistry` (extracted from `endpoint.rs` lines 66-116)
|
||||
- `src/endpoint.rs` — `AlknetEndpoint` struct, `new`, builder methods, `run`, `shutdown` (built fresh against ADR-083 shape)
|
||||
- `src/dispatch.rs` — `dispatch` (public), `build_auth_context`, ACME guard (extracted from `endpoint.rs` lines 330-490)
|
||||
- `src/accept/mod.rs` — accept module declarations
|
||||
- `src/accept/quinn.rs` — `dispatch_quinn`, `run_quinn_accept_loop`, `extract_quinn_alpn`, `extract_quinn_client_fingerprint` (extracted from `endpoint.rs` lines 287-388)
|
||||
- `src/accept/iroh.rs` — `dispatch_iroh`, `run_iroh_accept_loop`, `extract_iroh_client_fingerprint` (extracted from `endpoint.rs` lines 390-472)
|
||||
- `src/accept/tcp_tls.rs` — `dispatch_tcp_tls`, `run_tcp_tls_accept_loop`, `extract_tcp_tls_alpn`, `extract_tcp_tls_client_fingerprint` (new code, not in current `endpoint.rs`)
|
||||
|
||||
### Dependencies
|
||||
|
||||
Per the findings (Phase 2) and the architecture spec:
|
||||
|
||||
| Crate | Purpose |
|
||||
|-------|---------|
|
||||
| `alknet-core` | `Connection`, `ProtocolHandler`, `AuthContext`, `IdentityProvider`, `DynamicConfig` (workspace path) |
|
||||
| `quinn` 0.11 | QUIC transport (optional, feature-gated) |
|
||||
| `iroh` 0.28 | Iroh transport (optional, feature-gated) |
|
||||
| `tokio-rustls` 0.26 | TCP+TLS transport (optional, feature-gated) |
|
||||
| `tokio` 1 (full) | Async runtime, spawn, watch, TcpListener |
|
||||
| `arc-swap` 1 | `DynamicConfig` |
|
||||
| `tracing` 0.1 | Structured logging |
|
||||
|
||||
The endpoint does **not** depend on `alknet-tls` — it takes pre-built transports. TLS config
|
||||
construction stays at the assembly layer.
|
||||
|
||||
### Feature flags
|
||||
|
||||
```toml
|
||||
[features]
|
||||
default = []
|
||||
quinn = ["dep:quinn", "alknet-core/quinn"] # with_quinn — quinn accept loop
|
||||
iroh = ["dep:iroh", "alknet-core/iroh"] # with_iroh — iroh accept loop
|
||||
tcp = ["dep:tokio-rustls"] # with_tcp_tls — TCP+TLS accept loop
|
||||
```
|
||||
|
||||
The `quinn`/`iroh` features pull the corresponding features on `alknet-core` (for
|
||||
`Connection::from_quinn` / `from_iroh` — the constructors stay in core). A deployment
|
||||
enables the features for the transports it runs.
|
||||
|
||||
### Workspace Cargo.toml
|
||||
|
||||
Add `crates/alknet-endpoint` to the workspace `members` list in the root `Cargo.toml`.
|
||||
|
||||
### Module skeleton
|
||||
|
||||
```rust
|
||||
// src/lib.rs
|
||||
//! alknet-endpoint: Server-side multi-transport accept-loop runner.
|
||||
//!
|
||||
//! `AlknetEndpoint` takes pre-built transports (quinn, iroh, TCP+TLS) via
|
||||
//! builder methods, runs their accept loops inside `run()`, and dispatches
|
||||
//! each accepted connection to the registered `ProtocolHandler` by ALPN.
|
||||
//!
|
||||
//! The endpoint does not build transports and does not depend on
|
||||
//! `alknet-tls` — transport construction is the assembly layer's concern.
|
||||
|
||||
pub mod accept;
|
||||
pub mod dispatch;
|
||||
pub mod endpoint;
|
||||
pub mod registry;
|
||||
|
||||
// Re-exports (filled in by subsequent tasks)
|
||||
```
|
||||
|
||||
Each module file gets a doc comment and `// TODO: implement` marker.
|
||||
|
||||
## Acceptance Criteria
|
||||
|
||||
- [ ] `crates/alknet-endpoint/Cargo.toml` exists with all dependencies and feature flags
|
||||
- [ ] `crates/alknet-endpoint/src/lib.rs` exists with module declarations
|
||||
- [ ] Module skeleton files exist: `registry.rs`, `endpoint.rs`, `dispatch.rs`, `accept/mod.rs`, `accept/quinn.rs`, `accept/iroh.rs`, `accept/tcp_tls.rs`
|
||||
- [ ] Root `Cargo.toml` `members` list includes `crates/alknet-endpoint`
|
||||
- [ ] `cargo check -p alknet-endpoint` succeeds
|
||||
- [ ] `cargo clippy -p alknet-endpoint` succeeds with no warnings
|
||||
- [ ] Dual licensing: `MIT OR Apache-2.0` (workspace-inherited)
|
||||
- [ ] `alknet-core` dependency uses workspace path (`path = "../alknet-core"`)
|
||||
- [ ] No dependency on `alknet-tls` (endpoint takes pre-built transports)
|
||||
- [ ] Feature flags: `quinn`, `iroh`, `tcp` (all optional, default off)
|
||||
|
||||
## References
|
||||
|
||||
- docs/research/alknet-crate-extraction/findings.md — Phase 2
|
||||
- docs/architecture/crates/endpoint/README.md — full architecture spec
|
||||
- docs/architecture/decisions/083-endpoint-as-accept-loop-runner.md — ADR-083
|
||||
- crates/alknet-core/Cargo.toml — reference for dep versions
|
||||
- crates/alknet-tls/Cargo.toml — reference for feature flag pattern
|
||||
|
||||
## Notes
|
||||
|
||||
> This is the foundational setup task for alknet-endpoint. All subsequent endpoint/*
|
||||
> tasks depend on this one. The crate has no alknet dependencies beyond core.
|
||||
> The endpoint does NOT depend on alknet-tls — it takes pre-built transports via
|
||||
> builder methods. The `quinn`/`iroh` features pull the corresponding features on
|
||||
> `alknet-core` for `Connection::from_quinn` / `from_iroh` constructors.
|
||||
|
||||
## Summary
|
||||
|
||||
> To be filled on completion
|
||||
Reference in new issue
Block a user