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
//! # epics-bridge-rs
//!
//! EPICS protocol bridge/adapter hub.
//!
//! This crate hosts four bridge implementations as feature-gated
//! sub-modules. Each bridge connects EPICS data sources to network
//! protocols (CA or PVA). All four are implemented.
//!
//! ## Sub-modules
//!
//! | Module | Feature | Description |
//! |--------|---------|-------------|
//! | [`qsrv`] | `qsrv` (default) | Record → pvAccess channels (C++ QSRV equivalent) |
//! | `ca_gateway` | `ca-gateway` | CA fan-out gateway (C++ ca-gateway equivalent) |
//! | `pvalink` | `pvalink` | PVA links for record INP/OUT fields |
//! | [`pva_gateway`] | `pva-gateway` | PVA-to-PVA proxy (mirrors `pva2pva/p2pApp`) |
//!
//! Enable a bridge with its Cargo feature; `qsrv` is on by default.
//!
//! ## QSRV (Record ↔ PVA bridge)
//!
//! ```text
//! PVA Client ←→ [epics-pva-rs server] ←→ BridgeProvider ←→ PvDatabase
//! ```
//!
//! - [`BridgeProvider`] implements [`ChannelProvider`] — the PVA server calls
//! into it to resolve channel names and create channels.
//! - [`BridgeChannel`] serves single-record PVs (NTScalar, NTEnum, NTScalarArray).
//! - [`GroupChannel`] serves multi-record composite PVs from JSON config.
//! - [`BridgeMonitor`] / [`GroupMonitor`] bridge `DbSubscription` events to PVA monitor updates.
//!
//! The `ChannelProvider`, `Channel`, and `PvaMonitor` traits are defined in
//! [`qsrv`]; `qsrv::pva_adapter::QsrvPvStore` bridges them to the native
//! [`epics_pva_rs::server_native::ChannelSource`] trait so the native PVA
//! server can serve qsrv channels directly.
//!
//! ## ca-gateway (CA fan-out gateway)
//!
//! A pure-Rust port of EPICS `ca-gateway`: a Channel Access proxy that
//! accepts downstream client connections, connects to upstream IOCs,
//! caches PV values and fans out monitor events, applies `.pvlist`
//! access-security rules, and supports regex PV-name aliasing. Channel
//! resolution is lazy on-demand (a downstream search drives an upstream
//! subscription); preloading from a file is an opt-in convenience.
//!
//! ## pvalink (PVA links for record INP/OUT)
//!
//! Resolves record INP/OUT link strings of the form `@pva://<remote-pv>`
//! to a live PVA client that periodically reads the remote PV (INP) or
//! pushes record output to it (OUT). Mirrors pvxs `ioc/pvalink*.cpp`.
//!
//! ## pva-gateway (PVA-to-PVA proxy)
//!
//! A PVA-to-PVA proxy mirroring C++ `pva2pva/p2pApp`: one upstream
//! `PvaClient` keeps a per-PV channel cache, and one downstream
//! `PvaServer` forwards GET / PUT / MONITOR / GET_FIELD operations
//! through that cache.
pub use ;
// `EpicsValue` <-> `PvField` conversion helpers. Shared by the QSRV
// bridge and PVA links — both need to translate record values to/from
// pvData. Gated on the consumers that enable `epics-pva-rs` (the only
// extra dependency it uses) so a CA-only build still drops it.
// Convenience re-exports for the QSRV bridge (default feature).
// External users can write `epics_bridge_rs::BridgeProvider` directly.
pub use ;