1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
//! Transport binding layer for hibana choreography.
//!
//! This module provides a protocol-agnostic binding API that connects hibana's
//! flow-centric choreography to protocol-owned ingress buffers without exposing
//! transport details to application code.
//!
//! # Architecture
//!
//! ```text
//! ┌─────────────────────────────────────────────────────────────────┐
//! │ Application (uses only hibana flow API) │
//! │ endpoint.flow::<M>()?.send(&msg).await │
//! └─────────────────────────────────────────────────────────────────┘
//! ↓
//! ┌─────────────────────────────────────────────────────────────────┐
//! │ EndpointSlot (protocol-specific binder) │
//! │ - Demuxes incoming carrier data per logical lane │
//! │ - Exposes channel reads after route materialization │
//! └─────────────────────────────────────────────────────────────────┘
//! ↓
//! ┌─────────────────────────────────────────────────────────────────┐
//! │ Wire payload view │
//! └─────────────────────────────────────────────────────────────────┘
//! ```
//!
//! # Design Philosophy
//!
//! The transport seam owns wire send authority. Bindings are limited to ingress
//! demux and channel reads.
//!
//! # Key Components
//!
//! - `IngressEvidence`: Lane-local ingress evidence
//! - `EndpointSlot`: Trait for protocol-specific lane virtualization
//! - `enter()`: the only endpoint attach operation; binders are supplied with
//! `role(...).binding(slot).enter()`
/// Opaque handle to a binding-owned ingress payload.
;
// =============================================================================
// BindingError: binding-owned receive failures
// =============================================================================
/// Error returned by a binding when it cannot produce a payload view.
// =============================================================================
// IngressEvidence: demux evidence for incoming data
// =============================================================================
/// Lane-local demux evidence for an incoming frame.
///
/// This is returned by `EndpointSlot::poll_incoming_for_lane()` and contains
/// transport-observable facts for demux and decode channel selection. It is not
/// route authority; route decisions remain descriptor-checked by the localside
/// kernel.
// =============================================================================
// EndpointSlot: Protocol-agnostic binding trait
// =============================================================================
/// Slot trait for transport binding on an attached endpoint.
///
/// Transport/runtime integrations implement this trait to connect hibana's
/// localside send/recv operations to their ingress/egress integration.
///
/// The canonical attach path uses `enter()` and reads directly from transport.
/// Integrations that own ingress demux state attach this slot with
/// `role(...).binding(slot).enter()`; `enter()` remains the only attach verb.
///
/// # Receive Path
///
/// The receive path uses a lane-aware two-step approach:
///
/// 1. **Evidence** (`poll_incoming_for_lane`): Called by `offer()` to gather
/// demux evidence for the selected logical lane. Only returns evidence for
/// that lane.
///
/// 2. **Reading** (`on_recv`): Called after arm selection to read the actual
/// data. The channel comes from ingress evidence.
///
pub
// =============================================================================
// NoBinding: Zero-cost default binding
// =============================================================================
/// No-op binding slot for attached endpoints.
///
/// This is the default binding type for `Endpoint`. It does not allocate
/// binding storage or expose demux channels; receives use transport directly.
///
/// `NoBinding` returns `None` from `poll_incoming_for_lane()`, signaling
/// that transport's raw payload should be used directly without buffering.
;