Skip to main content

appcore_peer_rpc/
lib.rs

1// =============================================================================
2//        #######
3//     ###       ###     F: lib.rs
4//    ##   ## ##   ##    P: AppCore-Runtime
5//         ## ##
6//                       C: 2026/07/20 23:03:47 by dnettoRaw
7//    ##   ## ##   ##    U: 2026/07/24 16:07:49 by dnettoRaw
8//      ###########      S: 1.0.1-rc.8
9// =============================================================================
10
11//! Direct peer RPC contracts for private AppCore-to-AppCore calls.
12
13#![deny(missing_docs)]
14
15#[cfg(all(feature = "insecure-testing", not(debug_assertions)))]
16compile_error!("insecure-testing cannot be enabled in release builds");
17
18use appcore_core::{
19    validate_identifier, ClusterId, CoreId, CoreIdentity, DistributedCoreManifest, ProtocolVersion,
20    TenantId,
21};
22use appcore_security::{
23    CommandTokenError, CommandTokenFactory, CommandTokenValidator, HashTokenProvider, TokenClaims,
24    TokenProvider, LOCAL_ADMIN_SUBJECT,
25};
26pub use appcore_transport::CancellationToken;
27use axum::body::Bytes;
28use axum::extract::State;
29use axum::http::{header, HeaderMap, HeaderValue, StatusCode};
30use axum::response::{IntoResponse, Response};
31use axum::routing::{get, post};
32use axum::{Json, Router};
33use serde::Serialize;
34use sha2::{Digest, Sha256};
35use std::io;
36use std::sync::atomic::{AtomicBool, AtomicU64, Ordering};
37use std::sync::Arc;
38use std::time::{Duration, SystemTime, UNIX_EPOCH};
39
40/// Stable peer RPC wire contracts.
41pub mod v1 {
42    pub use appcore_distributed_contracts::peer_rpc::v1::*;
43}
44
45pub use v1::{
46    PeerAdvertisementV1, PeerCapabilityV1, PeerEndpointV1, PeerHealthResponse, PeerIdentityV1,
47    PeerManifestResponse, PeerRpcCallKind, PeerRpcClientExecutor, PeerRpcEnvelope, PeerRpcError,
48    PeerRpcOutboundRequest, PeerRpcResponse, PEER_COMMAND_PATH, PEER_HEALTH_PATH,
49    PEER_MANIFEST_PATH, PEER_QUERY_PATH,
50};
51
52const MAX_NONCE_CACHE_ENTRIES: usize = 65_536;
53const MAX_HTTP_HEADER_BYTES: usize = 32_768;
54const COMPRESSION_THRESHOLD_BYTES: usize = 1_024;
55const MAX_ENVELOPE_OVERHEAD_BYTES: usize = 65_536;
56
57mod advertisement;
58mod authentication;
59mod client;
60mod host;
61mod nonce;
62mod replay;
63mod transport;
64mod validation;
65
66#[cfg(any(test, feature = "insecure-testing"))]
67pub use authentication::{AllowPeerAuthenticator, StaticPeerRpcTokenIssuer};
68pub use authentication::{
69    HashTokenPeerAuthenticator, HashTokenPeerTokenIssuer, PeerRpcAuthenticator, PeerRpcDispatcher,
70    PeerRpcTokenIssuer,
71};
72pub use client::{
73    PeerRpcClient, PeerRpcClientConfig, PeerRpcHttpRequest, PeerRpcHttpResponse,
74    PeerRpcRetryPolicy, PeerTransportProvider,
75};
76pub use host::{PeerRpcHttpHost, PeerRpcHttpState};
77pub use nonce::{FilePeerNonceStore, InMemoryPeerNonceStore, PeerNonceStore};
78pub use replay::{BoundedReplayStore, ReplayStore, ReplayStoreConfig, ReplayStoreMetrics};
79pub use transport::StdPeerRpcTransport;
80pub use validation::{
81    envelope_signing_hash, payload_hash, route_for_command, route_for_query,
82    PeerRpcValidationConfig, PeerRpcValidator,
83};
84
85#[cfg(test)]
86mod tests;