tigrbl-kernel 0.4.4.dev1__tar.gz → 0.4.4.dev8__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/PKG-INFO +3 -4
  2. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/README.md +2 -3
  3. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/pyproject.toml +1 -1
  4. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/_compile.py +123 -18
  5. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/contract_classification.py +4 -0
  6. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/core.py +0 -4
  7. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/cross_transport.py +3 -3
  8. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/protocol_anchors.py +0 -12
  9. tigrbl_kernel-0.4.4.dev8/tigrbl_kernel/protocol_bindings.py +456 -0
  10. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/types.py +4 -0
  11. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/utils.py +2 -2
  12. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/webtransport_events.py +6 -3
  13. tigrbl_kernel-0.4.4.dev1/tigrbl_kernel/protocol_bindings.py +0 -284
  14. tigrbl_kernel-0.4.4.dev1/tigrbl_kernel/rust_compile.py +0 -24
  15. tigrbl_kernel-0.4.4.dev1/tigrbl_kernel/rust_plan.py +0 -20
  16. tigrbl_kernel-0.4.4.dev1/tigrbl_kernel/rust_spec.py +0 -36
  17. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/LICENSE +0 -0
  18. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/NOTICE +0 -0
  19. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/__init__.py +0 -0
  20. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/_build.py +0 -0
  21. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/atoms.py +0 -0
  22. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/cache.py +0 -0
  23. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/callbacks.py +0 -0
  24. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/channel_taxonomy.py +0 -0
  25. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/dispatch_taxonomy.py +0 -0
  26. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/eventkey.py +0 -0
  27. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/eventkey_hooks.py +0 -0
  28. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/events.py +0 -0
  29. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/helpers.py +0 -0
  30. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/hook_types.py +0 -0
  31. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/labels.py +0 -0
  32. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/lifecycle_matrix.py +0 -0
  33. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/loop_modes.py +0 -0
  34. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/loop_regions.py +0 -0
  35. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/measure.py +0 -0
  36. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/models.py +0 -0
  37. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/opchannel_capabilities.py +0 -0
  38. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/opview_compiler.py +0 -0
  39. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/ordering.py +0 -0
  40. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/packed_access.py +0 -0
  41. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/packed_selectors.py +0 -0
  42. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/payload.py +0 -0
  43. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/protocol_chains/__init__.py +0 -0
  44. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/protocol_chains/http_stream.py +0 -0
  45. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/protocol_chains/http_unary.py +0 -0
  46. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/protocol_chains/lifespan.py +0 -0
  47. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/protocol_chains/sse.py +0 -0
  48. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/protocol_chains/static_files.py +0 -0
  49. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/protocol_chains/websocket.py +0 -0
  50. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/protocol_completion.py +0 -0
  51. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/protocol_fusion.py +0 -0
  52. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/protocol_legality_matrix.py +0 -0
  53. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/protocol_phase_tree.py +0 -0
  54. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/protocol_streams.py +0 -0
  55. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/resume_policy.py +0 -0
  56. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/runtime_contracts.py +0 -0
  57. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/segment_fusion.py +0 -0
  58. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/subevent_handlers.py +0 -0
  59. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/subevent_taxonomy.py +0 -0
  60. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/trace.py +0 -0
  61. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/transaction_units.py +0 -0
  62. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/transport_atoms.py +0 -0
  63. {tigrbl_kernel-0.4.4.dev1 → tigrbl_kernel-0.4.4.dev8}/tigrbl_kernel/transport_events.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tigrbl-kernel
3
- Version: 0.4.4.dev1
3
+ Version: 0.4.4.dev8
4
4
  Summary: Kernel orchestration for composing Tigrbl runtime plans, bindings, operation dispatch, and optimized ASGI execution.
5
5
  License: Apache License
6
6
  Version 2.0, January 2004
@@ -318,7 +318,6 @@ Package catalog:
318
318
  - `tigrbl_kernel/protocol_bindings.py`, `tigrbl_kernel/protocol_phase_tree.py`, `tigrbl_kernel/protocol_chains/`, `tigrbl_kernel/protocol_completion.py`, `tigrbl_kernel/protocol_fusion.py`, and `tigrbl_kernel/protocol_legality_matrix.py`: transport-specific plan compilation, phase tree construction, chain definitions, completion semantics, fusion, and legality checks.
319
319
  - `tigrbl_kernel/eventkey.py`, `tigrbl_kernel/events.py`, `tigrbl_kernel/transport_events.py`, `tigrbl_kernel/webtransport_events.py`, `tigrbl_kernel/subevent_taxonomy.py`, and `tigrbl_kernel/subevent_handlers.py`: event-key construction, subevent taxonomy, and protocol subevent handler mapping.
320
320
  - `tigrbl_kernel/opchannel_capabilities.py`, `tigrbl_kernel/loop_modes.py`, `tigrbl_kernel/loop_regions.py`, `tigrbl_kernel/segment_fusion.py`, and `tigrbl_kernel/contract_classification.py`: channel capability checks, loop planning, segment grouping, and contract classification.
321
- - `tigrbl_kernel/rust_plan.py`, `tigrbl_kernel/rust_compile.py`, and `tigrbl_kernel/rust_spec.py`: deprecated compatibility shims; kernel planning is Python-only.
322
321
 
323
322
  ## Public API and Import Surface
324
323
 
@@ -354,9 +353,9 @@ Protocol planning keeps binding kind, family, framing, exchange, lane, subevent
354
353
  | `http.stream` / `https.stream` | stream | stream | handler invoke, transport emit, stream close. |
355
354
  | `http.sse` / `https.sse` | stream | SSE | encode event, emit event, close stream. |
356
355
  | `ws` / `wss` / `websocket` | message | text or negotiated JSON-RPC | accept, decode, dispatch, handler, emit/close. |
357
- | `webtransport` | session, stream, or datagram | WebTransport outer framing | lane-specific session, stream, or datagram rows with inner-framing validation. |
356
+ | `webtransport` | session, stream, or datagram | no top-level app framing | lane-specific session, stream, or datagram rows with lane-local framing validation. |
358
357
 
359
- Unsupported or ambiguous bindings raise planning errors. For example, WebSocket bindings do not accept HTTP methods, HTTP JSON-RPC requires an RPC method, WebTransport request/response exchange is unsupported, and WebTransport outer framing must remain `webtransport`.
358
+ Unsupported or ambiguous bindings raise planning errors. For example, WebSocket bindings do not accept HTTP methods, HTTP JSON-RPC requires an RPC method, WebTransport request/response exchange is unsupported, and WebTransport app framing must be declared on the relevant control stream, stream, or datagram lane.
360
359
 
361
360
  ## Hook Ordering and Labels
362
361
 
@@ -81,7 +81,6 @@ Package catalog:
81
81
  - `tigrbl_kernel/protocol_bindings.py`, `tigrbl_kernel/protocol_phase_tree.py`, `tigrbl_kernel/protocol_chains/`, `tigrbl_kernel/protocol_completion.py`, `tigrbl_kernel/protocol_fusion.py`, and `tigrbl_kernel/protocol_legality_matrix.py`: transport-specific plan compilation, phase tree construction, chain definitions, completion semantics, fusion, and legality checks.
82
82
  - `tigrbl_kernel/eventkey.py`, `tigrbl_kernel/events.py`, `tigrbl_kernel/transport_events.py`, `tigrbl_kernel/webtransport_events.py`, `tigrbl_kernel/subevent_taxonomy.py`, and `tigrbl_kernel/subevent_handlers.py`: event-key construction, subevent taxonomy, and protocol subevent handler mapping.
83
83
  - `tigrbl_kernel/opchannel_capabilities.py`, `tigrbl_kernel/loop_modes.py`, `tigrbl_kernel/loop_regions.py`, `tigrbl_kernel/segment_fusion.py`, and `tigrbl_kernel/contract_classification.py`: channel capability checks, loop planning, segment grouping, and contract classification.
84
- - `tigrbl_kernel/rust_plan.py`, `tigrbl_kernel/rust_compile.py`, and `tigrbl_kernel/rust_spec.py`: deprecated compatibility shims; kernel planning is Python-only.
85
84
 
86
85
  ## Public API and Import Surface
87
86
 
@@ -117,9 +116,9 @@ Protocol planning keeps binding kind, family, framing, exchange, lane, subevent
117
116
  | `http.stream` / `https.stream` | stream | stream | handler invoke, transport emit, stream close. |
118
117
  | `http.sse` / `https.sse` | stream | SSE | encode event, emit event, close stream. |
119
118
  | `ws` / `wss` / `websocket` | message | text or negotiated JSON-RPC | accept, decode, dispatch, handler, emit/close. |
120
- | `webtransport` | session, stream, or datagram | WebTransport outer framing | lane-specific session, stream, or datagram rows with inner-framing validation. |
119
+ | `webtransport` | session, stream, or datagram | no top-level app framing | lane-specific session, stream, or datagram rows with lane-local framing validation. |
121
120
 
122
- Unsupported or ambiguous bindings raise planning errors. For example, WebSocket bindings do not accept HTTP methods, HTTP JSON-RPC requires an RPC method, WebTransport request/response exchange is unsupported, and WebTransport outer framing must remain `webtransport`.
121
+ Unsupported or ambiguous bindings raise planning errors. For example, WebSocket bindings do not accept HTTP methods, HTTP JSON-RPC requires an RPC method, WebTransport request/response exchange is unsupported, and WebTransport app framing must be declared on the relevant control stream, stream, or datagram lane.
123
122
 
124
123
  ## Hook Ordering and Labels
125
124
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "tigrbl-kernel"
3
- version = "0.4.4.dev1"
3
+ version = "0.4.4.dev8"
4
4
  description = "Kernel orchestration for composing Tigrbl runtime plans, bindings, operation dispatch, and optimized ASGI execution."
5
5
  readme = "README.md"
6
6
  license = { file = "LICENSE" }
@@ -5,7 +5,17 @@ from types import SimpleNamespace
5
5
  from typing import Any, Mapping
6
6
 
7
7
  from tigrbl_atoms import StepFn
8
- from tigrbl_core._spec.binding_spec import HttpRestBindingSpec
8
+ from tigrbl_core._spec.binding_spec import (
9
+ HttpJsonRpcProtocolBindingSpec,
10
+ HttpRestBindingSpec,
11
+ HttpRestProtocolBindingSpec,
12
+ WebSocketProtocolBindingSpec,
13
+ WebTransportProtocolBindingSpec,
14
+ derive_websocket_subprotocol_for_framing,
15
+ derive_session_metadata_for_framing,
16
+ framing_kind,
17
+ framing_spec_name,
18
+ )
9
19
  from tigrbl_core.config.constants import __JSONRPC_DEFAULT_ENDPOINT__
10
20
  from tigrbl_core._spec.op_spec import OpSpec
11
21
  from tigrbl_core._spec.well_known_spec import well_known_op_alias
@@ -28,6 +38,69 @@ from .utils import (
28
38
  DEFAULT_PHASE_ORDER = tuple(getattr(_ev, "PHASES", ())) or _DEFAULT_PHASE_ORDER
29
39
 
30
40
 
41
+ def _route_metadata_for_binding(binding: Any) -> dict[str, Any]:
42
+ framing_obj = getattr(binding, "framing", None)
43
+ framing = framing_kind(framing_obj)
44
+ metadata: dict[str, Any] = {
45
+ "framing": framing,
46
+ "framing_kind": framing,
47
+ "framing_spec": framing_spec_name(framing_obj),
48
+ }
49
+ proto = str(getattr(binding, "proto", "") or "")
50
+ if isinstance(binding, WebSocketProtocolBindingSpec):
51
+ derived_subprotocol = derive_websocket_subprotocol_for_framing(framing_obj)
52
+ if derived_subprotocol is not None:
53
+ metadata["websocket_subprotocol"] = derived_subprotocol
54
+ elif proto in {"ws", "wss"}:
55
+ metadata.update(
56
+ derive_session_metadata_for_framing(
57
+ binding_kind=proto,
58
+ framing=framing_obj,
59
+ subprotocols=tuple(getattr(binding, "subprotocols", ()) or ()),
60
+ )
61
+ )
62
+ if isinstance(binding, WebTransportProtocolBindingSpec):
63
+ if binding.control_stream is not None:
64
+ control = binding.control_stream
65
+ metadata["control_stream"] = {
66
+ "name": control.name,
67
+ "kind": control.kind,
68
+ "opens": control.opens,
69
+ "purpose": control.purpose,
70
+ "framing": framing_kind(control.framing),
71
+ "framing_spec": framing_spec_name(control.framing),
72
+ }
73
+ metadata["streams"] = tuple(
74
+ {
75
+ "name": stream.name,
76
+ "kind": stream.kind,
77
+ "purpose": stream.purpose,
78
+ "framing": framing_kind(stream.framing),
79
+ "framing_spec": framing_spec_name(stream.framing),
80
+ }
81
+ for stream in binding.streams
82
+ )
83
+ metadata["datagrams"] = tuple(
84
+ {
85
+ "name": datagram.name,
86
+ "purpose": datagram.purpose,
87
+ "framing": framing_kind(datagram.framing),
88
+ "framing_spec": framing_spec_name(datagram.framing),
89
+ }
90
+ for datagram in binding.datagrams
91
+ )
92
+ elif proto == "webtransport":
93
+ lane = getattr(binding, "lane", None) or getattr(binding, "profile", None)
94
+ inner_framing = getattr(binding, "inner_framing", None)
95
+ metadata["lane"] = lane
96
+ metadata["inner_framing"] = framing_kind(inner_framing)
97
+ metadata["inner_framing_spec"] = framing_spec_name(inner_framing)
98
+ if inner_framing is not None:
99
+ metadata["inner_framing_kind"] = str(inner_framing)
100
+ metadata["inner_framing_spec"] = framing_spec_name(inner_framing)
101
+ return metadata
102
+
103
+
31
104
  def _pathspec_iter(app: Any) -> tuple[Any, ...]:
32
105
  collected: list[Any] = []
33
106
  collected.extend(tuple(getattr(app, "_tigrbl_path_specs", ()) or ()))
@@ -133,9 +206,13 @@ def _compile_plan(self: Any, app: Any) -> KernelPlan:
133
206
  from tigrbl_core._spec.binding_spec import (
134
207
  HttpJsonRpcBindingSpec,
135
208
  HttpRestBindingSpec,
209
+ HttpJsonRpcProtocolBindingSpec,
210
+ HttpRestProtocolBindingSpec,
136
211
  HttpStreamBindingSpec,
137
212
  SseBindingSpec,
213
+ WebSocketProtocolBindingSpec,
138
214
  WebTransportBindingSpec,
215
+ WebTransportProtocolBindingSpec,
139
216
  WsBindingSpec,
140
217
  )
141
218
 
@@ -169,7 +246,12 @@ def _compile_plan(self: Any, app: Any) -> KernelPlan:
169
246
  for binding in getattr(sp, "bindings", ()) or ():
170
247
  if isinstance(
171
248
  binding,
172
- (HttpRestBindingSpec, HttpStreamBindingSpec, SseBindingSpec),
249
+ (
250
+ HttpRestBindingSpec,
251
+ HttpRestProtocolBindingSpec,
252
+ HttpStreamBindingSpec,
253
+ SseBindingSpec,
254
+ ),
173
255
  ):
174
256
  bucket = route_data.setdefault(
175
257
  binding.proto, {"exact": {}, "templated": []}
@@ -199,34 +281,53 @@ def _compile_plan(self: Any, app: Any) -> KernelPlan:
199
281
  meta_index
200
282
  )
201
283
 
202
- elif isinstance(binding, HttpJsonRpcBindingSpec):
203
- endpoint = str(
204
- getattr(binding, "endpoint", __JSONRPC_DEFAULT_ENDPOINT__)
284
+ elif isinstance(binding, (HttpJsonRpcBindingSpec, HttpJsonRpcProtocolBindingSpec)):
285
+ rpc_path = str(
286
+ getattr(
287
+ binding,
288
+ "path",
289
+ getattr(binding, "endpoint", __JSONRPC_DEFAULT_ENDPOINT__),
290
+ )
205
291
  or __JSONRPC_DEFAULT_ENDPOINT__
206
292
  )
207
- selector = f"{endpoint}:{binding.rpc_method}"
293
+ rpc_method = getattr(
294
+ binding,
295
+ "method",
296
+ getattr(binding, "rpc_method", None),
297
+ )
298
+ selector = f"{rpc_path}:{rpc_method}"
208
299
  opkey_to_meta[OpKey(proto=binding.proto, selector=selector)] = (
209
300
  meta_index
210
301
  )
211
302
  proto_bucket = route_data.setdefault(
212
- binding.proto, {"endpoints": {}}
213
- )
214
- endpoint_bucket = proto_bucket.setdefault("endpoints", {}).setdefault(
215
- endpoint, {}
303
+ binding.proto, {"paths": {}, "endpoints": {}}
216
304
  )
217
- proto_bucket[binding.rpc_method] = meta_index
218
- endpoint_bucket[binding.rpc_method] = {
305
+ path_bucket = proto_bucket.setdefault("paths", {}).setdefault(rpc_path, {})
306
+ endpoint_bucket = proto_bucket.setdefault("endpoints", {}).setdefault(rpc_path, {})
307
+ proto_bucket[rpc_method] = meta_index
308
+ row = {
219
309
  "meta_index": meta_index,
220
310
  "selector": selector,
221
- "rpc_method": binding.rpc_method,
222
- "endpoint": endpoint,
311
+ "method": rpc_method,
312
+ "path": rpc_path,
223
313
  }
314
+ path_bucket[rpc_method] = row
315
+ endpoint_bucket[rpc_method] = row
224
316
 
225
- elif isinstance(binding, (WsBindingSpec, WebTransportBindingSpec)):
317
+ elif isinstance(
318
+ binding,
319
+ (
320
+ WsBindingSpec,
321
+ WebSocketProtocolBindingSpec,
322
+ WebTransportBindingSpec,
323
+ WebTransportProtocolBindingSpec,
324
+ ),
325
+ ):
226
326
  bucket = route_data.setdefault(
227
327
  binding.proto, {"exact": {}, "templated": []}
228
328
  )
229
329
  selector = binding.path
330
+ route_metadata = _route_metadata_for_binding(binding)
230
331
  opkey_to_meta[OpKey(proto=binding.proto, selector=selector)] = (
231
332
  meta_index
232
333
  )
@@ -240,13 +341,17 @@ def _compile_plan(self: Any, app: Any) -> KernelPlan:
240
341
  "names": names,
241
342
  "meta_index": meta_index,
242
343
  "selector": selector,
243
- "subprotocols": tuple(
244
- getattr(binding, "subprotocols", ()) or ()
245
- ),
344
+ **route_metadata,
246
345
  }
247
346
  )
248
347
  else:
249
348
  bucket["exact"][selector] = meta_index
349
+ bucket.setdefault("exact_metadata", {})[selector] = {
350
+ "path": binding.path,
351
+ "meta_index": meta_index,
352
+ "selector": selector,
353
+ **route_metadata,
354
+ }
250
355
 
251
356
  semantic = KernelPlan(
252
357
  proto_indices=route_data,
@@ -61,6 +61,9 @@ CANONICAL_CONTRACT_EVENTS: tuple[str, ...] = (
61
61
  "webtransport.stream.stop_sending",
62
62
  "webtransport.datagram.receive",
63
63
  "webtransport.datagram.send",
64
+ "stream.resume.request",
65
+ "stream.resume.accept",
66
+ "stream.resume.reject",
64
67
  "webtransport.disconnect",
65
68
  "webtransport.close",
66
69
  "transport.emit.complete",
@@ -71,6 +74,7 @@ _EVENT_SCOPE_PREFIXES: dict[str, str] = {
71
74
  "http.": "http",
72
75
  "websocket.": "websocket",
73
76
  "webtransport.": "webtransport",
77
+ "stream.resume.": "webtransport",
74
78
  "transport.emit.": "webtransport",
75
79
  }
76
80
 
@@ -24,7 +24,6 @@ from .cache import _SpecsOnceCache, _WeakMaybeDict
24
24
  from .models import KernelPlan, OpView
25
25
  from .opview_compiler import compile_opview_from_specs
26
26
  from .types import DEFAULT_PHASE_ORDER as _DEFAULT_PHASE_ORDER
27
- from .rust_compile import build_rust_kernel as _build_rust_kernel
28
27
  from .utils import (
29
28
  _opspecs,
30
29
  _table_iter,
@@ -155,9 +154,6 @@ class Kernel:
155
154
  return payload
156
155
  return {}
157
156
 
158
- def compile_rust_plan(self, app: Any):
159
- return _build_rust_kernel(app)
160
-
161
157
  def invalidate_kernelz_payload(self, app: Optional[Any] = None) -> None:
162
158
  with self._lock:
163
159
  if app is None:
@@ -27,7 +27,7 @@ TRANSPORT_ENVELOPE_KEYS = frozenset(
27
27
  class EquivalenceCase:
28
28
  op_id: str
29
29
  category: str
30
- bindings: tuple[Mapping[str, Any], ...]
30
+ bindings: tuple[Any, ...]
31
31
 
32
32
 
33
33
  def canonical_operation_id(op_id: str) -> str:
@@ -42,7 +42,7 @@ def canonical_operation_id(op_id: str) -> str:
42
42
 
43
43
  def compile_equivalence_manifest(
44
44
  op_id: str,
45
- bindings: Iterable[Mapping[str, Any]],
45
+ bindings: Iterable[Any],
46
46
  *,
47
47
  schema_identity: str = "schema:v1",
48
48
  runtime_plan_identity: str = "runtime-plan:v1",
@@ -80,7 +80,7 @@ def equivalent_transport_results(*results: Mapping[str, Any]) -> bool:
80
80
  return all(normalized_transport_result(result) == first for result in results[1:])
81
81
 
82
82
 
83
- def equivalent_binding_group(op_id: str, bindings: Iterable[Mapping[str, Any]]) -> bool:
83
+ def equivalent_binding_group(op_id: str, bindings: Iterable[Any]) -> bool:
84
84
  manifest = compile_equivalence_manifest(op_id, bindings)
85
85
  families = {binding["family"] for binding in manifest["bindings"]}
86
86
  return bool(families) and len({manifest["op_id"]}) == 1
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from typing import Any
4
- import warnings
5
4
 
6
5
 
7
6
  def canonical_protocol_anchor_order(
@@ -32,18 +31,7 @@ def python_protocol_anchor_trace(case: dict[str, Any]) -> tuple[str, ...]:
32
31
  )
33
32
 
34
33
 
35
- def rust_protocol_anchor_trace(case: dict[str, Any]) -> tuple[str, ...]:
36
- del case
37
- warnings.warn(
38
- "rust_protocol_anchor_trace is deprecated; protocol anchors are Python-only.",
39
- DeprecationWarning,
40
- stacklevel=2,
41
- )
42
- raise RuntimeError("rust_protocol_anchor_trace is unavailable.")
43
-
44
-
45
34
  __all__ = [
46
35
  "canonical_protocol_anchor_order",
47
36
  "python_protocol_anchor_trace",
48
- "rust_protocol_anchor_trace",
49
37
  ]