1pub mod host;
11pub mod transport;
12#[cfg(feature = "webrtc")]
13pub mod webrtc;
14pub mod wire_input;
15
16pub use host::{
17 DEFAULT_LIVE_TOOL_TIMEOUT, DeltaIdentity, LiveAdapterHost, LiveAdapterHostError,
18 LiveChannelCloseCommitAuthority, LiveChannelCloseObservation, LiveChannelId,
19 LiveChannelOpenAuthority, LiveChannelStatusCommitAuthority, LiveChannelStatusObservation,
20 LiveCommandAcceptanceKind, LiveCommandQueueAcceptance, LiveProjectionError, LiveProjectionSink,
21 LiveRefreshQueueAcceptance, LiveToolDispatchError, LiveToolDispatchTimeout, LiveToolDispatcher,
22 LiveTranscriptIdentity, LiveTranscriptIdentityError, NoOpProjectionSink, ObservationOutcome,
23 ObservationRouting, ToolDispatchSkipReason,
24};
25pub use transport::{
26 LIVE_WS_PATH, LiveChannelCloseFeedback, LiveChannelStatusFeedback, LiveTokenString,
27 LiveWsState, LiveWsTokenAdmission, LiveWsTokenAdmissionPublicErrorClass,
28 LiveWsTokenAdmissionRejection, LiveWsTokenAuthority, LiveWsTokenIssue, live_ws_router,
29 serve_live_ws_listener,
30};
31#[cfg(feature = "webrtc")]
32pub use webrtc::{
33 LIVE_WEBRTC_ANSWER_METHOD, LIVE_WEBRTC_ANSWER_PATH, LiveWebrtcAnswerAccepted, LiveWebrtcError,
34 LiveWebrtcState, WebrtcAudioBridge, live_webrtc_router, serve_live_ws_and_webrtc_listener,
35};
36pub use wire_input::{
37 LiveInputChunkDecodeError, live_input_chunk_decode_rejection, live_input_chunk_from_wire,
38};
39
40#[cfg(test)]
50mod e26_dependency_direction {
51 #[test]
58 fn cargo_toml_does_not_depend_on_meerkat_runtime() {
59 let cargo_toml = include_str!("../Cargo.toml");
60 for line in cargo_toml.lines() {
63 let trimmed = line.trim_start();
64 assert!(
65 !trimmed.starts_with("meerkat-runtime"),
66 "E26 regression: meerkat-live must not depend on meerkat-runtime; \
67 found Cargo.toml line: {line}"
68 );
69 }
70 }
71
72 #[test]
73 fn webrtc_media_dependencies_are_feature_gated() {
74 let cargo_toml = include_str!("../Cargo.toml");
75 assert!(
76 cargo_toml.lines().any(|line| line.trim() == "default = []"),
77 "meerkat-live default feature set must not enable WebRTC/media"
78 );
79 for dep in ["webrtc", "webrtc-media", "opus", "rubato"] {
80 let needle = format!("{dep} = ");
81 let dep_line = cargo_toml
82 .lines()
83 .find(|line| line.trim_start().starts_with(&needle))
84 .unwrap_or_else(|| panic!("missing optional {dep} dependency"));
85 assert!(
86 dep_line.contains("optional = true"),
87 "{dep} dependency must stay optional: {dep_line}"
88 );
89 }
90 }
91}