zerodds_amqp_endpoint/lib.rs
1// SPDX-License-Identifier: Apache-2.0
2// Copyright 2026 ZeroDDS Contributors
3
4//! Crate `zerodds-amqp-endpoint`. Safety classification: **STANDARD**.
5//!
6//! DDS-AMQP 1.0 bidirektionaler Endpoint-Stack — pure-Rust
7//! `no_std + alloc` (mit optionaler `std`-Loader-Schicht),
8//! `forbid(unsafe_code)`. Implementiert die Protokoll-Schichten
9//! oberhalb des Wire-Codecs (`zerodds-amqp-bridge`):
10//!
11//! Spec: OMG DDS-AMQP-1.0 (formal/2024-08-01) §2.1 (Endpoint-Profile),
12//! §6.1 (Direct-Embed-Topology), §7 (Mapping), §11 (Errors), Annex A
13//! (Configuration-Schema). OASIS AMQP-1.0 §2.4 (Connection-State),
14//! §2.5 (Session-State), §2.6 (Link-Lifecycle).
15//!
16//! ## Schichten-Position
17//!
18//! Layer 5 — Bridges. Sitzt auf
19//! [`zerodds-amqp-bridge`](../zerodds_amqp_bridge/index.html) (Wire-
20//! Codec). Der TCP/TLS-Listener selbst lebt im Daemon-Crate
21//! `tools/amqp-dds-endpoint/`; diese Crate liefert die wire-
22//! unabhaengigen Protokoll-Schichten.
23//!
24//! ## Public API (Stand 1.0.0-rc.1)
25//!
26//! - [`sasl`] — SASL-Frame-Layer (PLAIN / ANONYMOUS / EXTERNAL)
27//! gemaess Spec §10.2.
28//! - [`session`] — Connection/Session-State-Machine + Idle-Timeout +
29//! DoS-Caps gemaess Spec §6.1.
30//! - [`link`] — Sender-/Receiver-Link-Acceptance + Settlement-
31//! Tracking + Disposition-Mapper-Wire-up (§7.4 + §7.7.3).
32//! - [`routing`] — Address-Resolution + Wildcard-Mapping gemaess
33//! Spec §7.3.
34//! - [`mapping`] — Body-Encoding-Mode-Mapping (Pass-Through / JSON /
35//! AMQP-Native) gemaess Spec §8.1.
36//! - [`properties`] — Application-Properties-Codec mit
37//! `dds:operation` / `dds:instance-handle` / `dds:type-id`.
38//! - [`dds_bridge`] — Trait-Surfaces ([`DdsOperationDispatcher`] +
39//! [`DispositionMapper`]) fuer Caller-DCPS-Bruecken.
40//! - [`management`] — Catalog + Audit-Producers + Metrics-Snapshots.
41//! - [`metrics`] — Mandatory-Metric-Hub.
42//! - [`security`] — Access-Control-Plugin-Surface + Governance.
43//! - [`coexistence`] — Multi-Bridge-Hop-Cap + Inbound-Decision.
44//! - [`rpc_correlation`] — Outstanding-Calls + Reply-Routing.
45//! - [`errors`] — Spec-§11 Error-Conditions als typisierte Errors.
46//! - [`limits`] — `ResourceLimits`-Datenmodell aus Annex A.
47//! - [`keyhash`] — SHA-256 group-id-Hashing fuer §7.6.1.
48//! - [`annex_a`] — IDL-Spiegelung des Annex-A-Configuration-Schemas.
49//! - [`codegen_helpers`] — Helpers fuer den Annex-A-IDL-Codegen.
50//! - [`config_xml`] (Feature `std`) — XML-Configuration-Loader (§9.2).
51//!
52//! ## Was Caller-Layer ist
53//!
54//! - **TCP-Listener-Operations** und **TLS-Termination** —
55//! Daemon-Crate (`tools/amqp-dds-endpoint/`) mit `tokio` + `rustls`.
56//! - **Discovery-Wire** — DDS-SPDP/SEDP-Bridge zur DDS-Side lebt in
57//! `crates/discovery/`.
58//! - **Live-Interop-Smoke** gegen pika/qpid-proton/Azure-SB —
59//! Test-Harness im Daemon-Crate.
60
61#![forbid(unsafe_code)]
62#![warn(missing_docs)]
63
64extern crate alloc;
65
66pub mod annex_a;
67pub mod backoff;
68// Bridge-Security-Adapter (Bridge-Spec §7.1 TLS via rustls, §7.2 Auth-Modes,
69// §7.3 Topic-ACL). std-only (rustls braucht std).
70#[cfg(feature = "std")]
71pub mod bridge_security;
72// Daemon-Runtime-Wireup (§5.2 Catalog, §8.2 Prometheus, §8.3 OTLP,
73// §9.2 Graceful Shutdown). std-only.
74#[cfg(feature = "std")]
75pub mod daemon_runtime;
76// DDS-QoS → AMQP-Behavior-Translation (Spec §6).
77pub mod codegen_helpers;
78pub mod coexistence;
79#[cfg(feature = "std")]
80pub mod config_xml;
81pub mod dds_bridge;
82pub mod errors;
83pub mod keyhash;
84pub mod limits;
85pub mod link;
86pub mod management;
87pub mod mapping;
88pub mod metrics;
89pub mod properties;
90#[cfg(feature = "std")]
91pub mod qos_translation;
92pub mod routing;
93pub mod rpc_correlation;
94pub mod sasl;
95pub mod security;
96pub mod session;
97
98pub use coexistence::{
99 BridgeId, CoexistenceConfig, DEFAULT_HOP_CAP, InboundDecision, MAX_HOP_CAP, inspect_inbound,
100 stamp_outbound,
101};
102pub use dds_bridge::{
103 AcceptAllDispatcher, DdsOperationDispatcher, DispatchOutcome, DispositionMapper,
104 DispositionState, InboundOperation, InstanceTrackingDispatcher, NoopDispositionMapper,
105};
106pub use errors::{
107 AmqpError, AmqpErrorCondition, ErrorDescription, ErrorScope, access_denied, instance_unknown,
108 map_mapping_error, map_resolution_error, register_missing_key, resource_limit_exceeded,
109 unknown_dds_operation, unsettled_state_not_implemented,
110};
111pub use limits::ResourceLimits;
112pub use link::{
113 AttachDurabilityCheck, LinkRole, LinkSession, SettlementMode, TerminusDurability,
114 check_attach_durability,
115};
116pub use management::{
117 AddressKind, AuditEvent, AuditProducer, CatalogDirection, CatalogEntry, CatalogProducer,
118 CatalogTypeId, addresses, audit_event_sample, classify_address, metrics_snapshot,
119};
120pub use mapping::{BodyEncodingMode, MappingError, encode_dds_to_amqp_body, parse_amqp_body};
121pub use metrics::{MANDATORY_METRIC_NAMES, MetricsHub};
122pub use properties::{
123 DdsOperation, ProducedProperties, SampleHeader, TypeIdCheck, inspect_dds_type_id, message_id,
124 produce_application_properties, produce_properties,
125};
126pub use routing::{AddressResolution, AddressRouter, ResolutionError, effective_partitions};
127pub use rpc_correlation::{
128 DEFAULT_MAX_OUTSTANDING_CALLS, DEFAULT_RPC_TIMEOUT_MS, IssueDecision, OutstandingCalls,
129 ReplyDecision, ReplyProperties, RpcConfig,
130};
131pub use sasl::{SaslCode, SaslMechanism, SaslOutcome, SaslState};
132pub use security::{
133 AccessControlPlugin, AccessDecision, AccessOp, AllowAll, DataProtectionKind, DualIdentity,
134 GovernanceDocument, GovernanceRule, IdentityToken, LinkGovernance, SaslSubject,
135 StaticAllowList, build_identity_token, class_ids,
136};
137pub use session::{
138 ConnectionState, EndpointConfig, EndpointError, SessionState, advance_connection,
139};