zerodds_grpc_bridge/lib.rs
1// SPDX-License-Identifier: Apache-2.0
2// Copyright 2026 ZeroDDS Contributors
3
4//! Crate `zerodds-grpc-bridge`. Safety classification: **STANDARD**.
5//!
6//! gRPC-over-HTTP/2 + gRPC-Web Wire-Codec — pure-Rust `no_std +
7//! alloc`, `forbid(unsafe_code)`. Implementiert die gRPC-spezifischen
8//! Wire-Elemente die ueber dem HTTP/2-Stack sitzen: Length-Prefixed-
9//! Message (LPM), Path-Parsing, Timeout-Header, Status-Codes,
10//! Custom-Metadata-Encoding (inkl. `-bin`-Suffix-Konvention),
11//! gRPC-Web-Trailer-Frames und ein gRPC-Server-Skeleton fuer
12//! Caller-konfigurierte HTTP/2-Listener.
13//!
14//! Spec: gRPC HTTP/2 Protocol (Length-Prefixed Message + Path +
15//! Timeout + Status + Custom-Metadata) + gRPC-Web Specification
16//! (Trailer-Frame + Content-Types).
17//!
18//! ## Schichten-Position
19//!
20//! Layer 5 — Bridges. Sitzt auf [`zerodds-http2`](../zerodds_http2/index.html)
21//! (RFC 9113 Framing + Stream-State + Flow-Control) und
22//! [`zerodds-hpack`](../zerodds_hpack/index.html) (RFC 7541 Header-
23//! Compression). HTTP/2-Connection-Lifecycle und HEADERS/CONTINUATION-
24//! Encoding kommen aus diesen Substrat-Crates; gRPC-Bridge konzentriert
25//! sich auf das gRPC-Application-Layer-Wire-Format.
26//!
27//! ## Public API (Stand 1.0.0-rc.1)
28//!
29//! - [`encode_message`] / [`decode_message`] / [`FrameError`] — gRPC
30//! Length-Prefixed-Message (LPM): Compressed-Flag (1 byte) +
31//! Message-Length (4-byte BE) + Message-Bytes.
32//! - [`parse_path`] / [`PathError`] — `/<service>/<method>` aus HTTP
33//! `:path`.
34//! - [`encode_timeout`] / [`decode_timeout`] / [`TimeoutUnit`] /
35//! [`TimeoutError`] — `grpc-timeout` Header value + unit
36//! (H/M/S/m/u/n).
37//! - [`Status`] — alle 17 gRPC Status-Codes (0..=16).
38//! - [`encode_header_value`] / [`decode_header_value`] /
39//! [`encode_base64`] / [`decode_base64`] / [`is_binary_header`] /
40//! [`BIN_SUFFIX`] / [`MetadataError`] — Custom-Metadata-Encoding
41//! (`-bin`-Suffix → Base64).
42//! - [`request_headers`] / [`response_headers`] / [`content_types`]
43//! — Standard-Header-Sets fuer Request/Response/gRPC-Web/JSON.
44//! - [`GrpcServer`] / [`GrpcRequest`] / [`GrpcResponse`] — gRPC-
45//! Server-Skeleton fuer Caller-konfigurierte HTTP/2-Listener.
46//!
47//! ## Beispiel
48//!
49//! ```rust
50//! use zerodds_grpc_bridge::{decode_message, encode_message};
51//!
52//! let msg = b"hello-grpc";
53//! let wire = encode_message(msg, false).expect("encode");
54//! let (flag, payload, consumed) = decode_message(&wire).expect("decode");
55//! assert_eq!(flag, 0);
56//! assert_eq!(payload, msg);
57//! assert_eq!(consumed, wire.len());
58//! ```
59
60#![forbid(unsafe_code)]
61#![warn(missing_docs)]
62
63extern crate alloc;
64
65// Bridge-Security-Adapter (Bridge-Spec §7.1 TLS via rustls/HTTP-2-ALPN,
66// §7.2 Auth-Modes, §7.3 Topic-ACL). std-only.
67#[cfg(feature = "std")]
68pub mod bridge_security;
69// Daemon-Runtime-Adapter + QoS-Translation. std-only.
70#[cfg(feature = "std")]
71pub mod daemon_runtime;
72pub mod frame;
73pub mod metadata;
74pub mod path;
75#[cfg(feature = "std")]
76pub mod qos_translation;
77pub mod reflection;
78pub mod server;
79pub mod service_gen;
80pub mod status;
81pub mod timeout;
82
83pub use frame::{FrameError, decode_message, encode_message};
84pub use metadata::{
85 BIN_SUFFIX, MetadataError, content_types, decode_base64, decode_header_value, encode_base64,
86 encode_header_value, is_binary_header, request_headers, response_headers,
87};
88pub use path::{PathError, parse_path};
89pub use server::{GrpcRequest, GrpcResponse, GrpcServer};
90pub use status::Status;
91pub use timeout::{TimeoutError, TimeoutUnit, decode_timeout, encode_timeout};