1#![forbid(unsafe_code)]
11#![deny(missing_docs)]
12#![allow(deprecated)]
13
14mod address;
15mod citizen;
16mod cli;
17mod clock;
18mod codecio;
19mod connection;
20#[cfg(feature = "cookbook-web")]
21mod cookbook_web;
22#[cfg(feature = "cookbook-web")]
23mod cookbook_web_json;
24mod coroutine;
25mod cron;
26mod device_edge;
27mod dispatch;
28mod frame;
29mod helpers;
30#[cfg(feature = "server-net-http")]
31mod http;
32#[cfg(feature = "server-net-http")]
33mod http_client;
34mod isolation;
35mod ops;
36mod ops_lifecycle;
37mod ops_shell;
38mod pool;
39mod raw_http;
40mod realize;
41mod registries;
42mod repl;
43mod router;
44mod runtime;
45mod server;
46mod site;
47mod stream_support;
48mod transport;
49mod trigger;
50mod voice;
51#[cfg(feature = "wasm")]
52mod wasm;
53
54pub use address::ServerAddress;
55pub use citizen::{
56 ServerAddressDescriptor, ServerFrameDescriptor, server_address_class_symbol,
57 server_frame_class_symbol,
58};
59pub use clock::{DeterministicWallClock, SystemWallClock, WallClock, WallTimestamp};
60pub use codecio::{decode_frame_payload, encode_frame_payload};
61pub use connection::{Connection, Session};
62#[cfg(feature = "cookbook-web")]
63pub use cookbook_web::{CookbookWebResponse, CookbookWebState};
64pub use coroutine::{Coroutine, CoroutineStatus};
65pub use device_edge::{
66 DeviceEdgeProfile, DeviceEdgeSession, LedgerRef, LinkKind, register_watch_edge_session,
67 watch_route_order,
68};
69pub use frame::{
70 FrameEnvelope, FrameKind, LifecycleCommand, ServerFrame, eval_reply_from_frame,
71 eval_request_from_frame, server_frame_from_reply, server_frame_from_request,
72};
73pub use helpers::parse_duration;
74#[cfg(feature = "server-net-http")]
75pub use http_client::{HttpGetResponse, http_get};
76pub use isolation::{IsolationPolicy, ShareMode};
77pub use pool::{WorkerPool, default_worker_pool};
78pub use raw_http::{
79 BodyLimits, BodyReader, Header, RawConnection, RawHandler, RawHttpServer, RequestHead,
80 RequestScope, ResponseHead, ResponseWriter, TrailersPolicy,
81};
82pub use realize::{realize as realize_site_fragment, realize_stream_events};
83pub use registries::{
84 AddressResolver, LineDriverFactory, ResolvedAddress, register_address_resolver,
85 register_line_driver,
86};
87pub(crate) use registries::{address_resolvers, line_driver_factories};
88pub use repl::{DriverSpec as ReplDriverSpec, LineDriver, ReplOptions, ReplOutput, run_repl};
89pub use router::FrameRouter;
90pub use runtime::ServerRuntime;
91pub use server::{Server, ServerStatus, ThreadMode};
92pub use sim_cookbook::EmbeddedDir;
93#[cfg(feature = "cookbook-web")]
94pub use sim_lib_cookbook::CookbookCapabilityProfile;
95pub use site::{
96 CoroutineEvalSite, EvalSite, FabricEvalSite, LocalEvalSite, LoopEvalSite, PipelineEvalSite,
97 Site, SiteKind, StreamSink,
98};
99pub use stream_support::{
100 BufferedStreamSink, StreamHandle, stream_chunk_frame_from_expr, stream_end_frame,
101 stream_frame_from_expr, stream_frame_to_expr, stream_frame_to_value,
102};
103pub use transport::{
104 ConnectionTransport, LocalTransport, LoopbackTransportEndpoint, ServerTransport,
105 TcpServerTransport, connect_transport_site, connect_transport_site_with_loopback,
106 decode_transport_frame, encode_transport_frame, register_loopback_transport_endpoint,
107};
108pub use trigger::TriggerHandle;
109pub use voice::{
110 ASR_TRANSCRIPT_KIND, ASR_TRANSCRIPT_NAMESPACE, MIC_CAPTURE_KIND, MIC_CAPTURE_NAMESPACE,
111 ModeledAsrFabric, XR_MIC_CHUNK_KIND, XR_MIC_CHUNK_NAMESPACE, modeled_asr_site,
112 modeled_glasses_asr_site,
113};
114#[cfg(feature = "wasm")]
115pub use wasm::register_wasm_region;
116
117use crate::isolation::IsolatedEvalSite;
118use cli::{register_server_cli, server_cli_exports};
119use dispatch::{register_server_functions, server_exports};
120use helpers::{
121 connection_arg, coroutine_target_from_value, ensure_installed_codec, keyword, server_arg,
122 server_from_value,
123};
124use ops::{
125 server_cancel_coroutine, server_connect, server_coroutine_status, server_lisp, server_loop,
126 server_notify, server_pipeline, server_realize, server_receive, server_request,
127 server_resume_exprs, server_send, server_start_loop, server_stream, server_stream_next,
128 server_yield,
129};
130use ops_lifecycle::server_start;
131use ops_shell::{server_repl, server_trigger, server_trigger_poll, server_wasm_region};
132use sim_kernel::{
133 AbiVersion, Cx, Lib, LibManifest, LibTarget, Linker, Result, Symbol, Value, Version,
134};
135use stream_support::stream_handle_arg;
136use transport::shutdown_server_transport;
137
138pub struct ServerLib;
141
142impl Lib for ServerLib {
143 fn manifest(&self) -> LibManifest {
144 LibManifest {
145 id: Symbol::new("server"),
146 version: Version(env!("CARGO_PKG_VERSION").to_owned()),
147 abi: AbiVersion { major: 0, minor: 1 },
148 target: LibTarget::HostRegistered,
149 requires: Vec::new(),
150 capabilities: Vec::new(),
151 exports: {
152 let mut exports = server_exports();
153 exports.extend(server_cli_exports());
154 exports
155 },
156 }
157 }
158
159 fn load(&self, cx: &mut sim_kernel::LoadCx, linker: &mut Linker<'_>) -> Result<()> {
160 register_server_functions(cx, linker)?;
161 register_server_cli(cx, linker)?;
162 Ok(())
163 }
164}
165
166pub fn install_server_lib(cx: &mut Cx) -> Result<()> {
169 sim_lib_core::install_once(cx, &ServerLib).map(|_| ())
170}
171
172pub(crate) fn symbol_list_value(cx: &mut Cx, symbols: &[Symbol]) -> Result<Value> {
173 cx.factory().list(
174 symbols
175 .iter()
176 .cloned()
177 .map(|symbol| cx.factory().symbol(symbol))
178 .collect::<Result<Vec<_>>>()?,
179 )
180}
181
182pub static RECIPES: sim_cookbook::EmbeddedDir =
184 include!(concat!(env!("OUT_DIR"), "/cookbook_recipes.rs"));
185
186#[cfg(test)]
187mod tests;