Skip to main content

sim_lib_server/
lib.rs

1//! SIM's server library: a loadable lib that serves eval and agents over a
2//! transport. It exposes sites (local, coroutine, pipeline, loop, fabric),
3//! frame routing, REPL drivers, connections, and transports so callers can
4//! request evaluation, stream replies, and run agent loops across the runtime.
5//!
6//! Transports are in-process by default: the default feature set enables no
7//! network surface. The network/HTTP transport is the non-default
8//! `server-net-http` feature and must be opted into explicitly; the various
9//! `trigger-*` features add their respective inbound triggers the same way.
10#![forbid(unsafe_code)]
11#![deny(missing_docs)]
12#![allow(deprecated)]
13
14mod address;
15mod citizen;
16mod cli;
17mod codecio;
18mod connection;
19mod cookbook_web;
20mod cookbook_web_json;
21mod coroutine;
22mod cron;
23mod dispatch;
24mod frame;
25mod helpers;
26#[cfg(feature = "server-net-http")]
27mod http;
28#[cfg(feature = "server-net-http")]
29mod http_client;
30mod isolation;
31mod ops;
32mod ops_lifecycle;
33mod ops_shell;
34mod pool;
35mod realize;
36mod registries;
37mod repl;
38mod router;
39mod runtime;
40mod server;
41mod site;
42mod stream_support;
43mod transport;
44mod trigger;
45mod wasm;
46
47pub use address::ServerAddress;
48pub use citizen::{
49    ServerAddressDescriptor, ServerFrameDescriptor, server_address_class_symbol,
50    server_frame_class_symbol,
51};
52pub use codecio::{decode_frame_payload, encode_frame_payload};
53pub use connection::{Connection, Session};
54pub use cookbook_web::{CookbookWebResponse, CookbookWebState};
55pub use coroutine::{Coroutine, CoroutineStatus};
56pub use frame::{
57    FrameEnvelope, FrameKind, LifecycleCommand, ServerFrame, eval_reply_from_frame,
58    eval_request_from_frame, server_frame_from_reply, server_frame_from_request,
59};
60pub use helpers::parse_duration;
61#[cfg(feature = "server-net-http")]
62pub use http_client::{HttpGetResponse, http_get};
63pub use isolation::{IsolationPolicy, ShareMode};
64pub use realize::{realize as realize_site_fragment, realize_stream_events};
65pub use registries::{
66    AddressResolver, LineDriverFactory, ResolvedAddress, register_address_resolver,
67    register_line_driver,
68};
69pub(crate) use registries::{address_resolvers, line_driver_factories};
70pub use repl::{DriverSpec as ReplDriverSpec, LineDriver, ReplOptions, ReplOutput, run_repl};
71pub use router::FrameRouter;
72pub use runtime::ServerRuntime;
73pub use server::{Server, ServerStatus, ThreadMode};
74pub use site::{
75    CoroutineEvalSite, EvalSite, FabricEvalSite, LocalEvalSite, LoopEvalSite, PipelineEvalSite,
76    Site, SiteKind, StreamSink,
77};
78pub use stream_support::{
79    BufferedStreamSink, StreamHandle, stream_chunk_frame_from_expr, stream_end_frame,
80    stream_frame_from_expr, stream_frame_to_expr, stream_frame_to_value,
81};
82pub use transport::{
83    ConnectionTransport, LocalTransport, LoopbackTransportEndpoint, ServerTransport,
84    TcpServerTransport, connect_transport_site, connect_transport_site_with_loopback,
85    decode_transport_frame, encode_transport_frame, register_loopback_transport_endpoint,
86};
87pub use trigger::TriggerHandle;
88pub use wasm::register_wasm_region;
89
90use crate::isolation::IsolatedEvalSite;
91use cli::{register_server_cli, server_cli_exports};
92use dispatch::{register_server_functions, server_exports};
93use helpers::{
94    connection_arg, coroutine_target_from_value, ensure_installed_codec, keyword, server_arg,
95    server_from_value,
96};
97use ops::{
98    server_cancel_coroutine, server_connect, server_coroutine_status, server_lisp, server_loop,
99    server_notify, server_pipeline, server_realize, server_receive, server_request,
100    server_resume_exprs, server_send, server_start_loop, server_stream, server_stream_next,
101    server_yield,
102};
103use ops_lifecycle::server_start;
104use ops_shell::{server_repl, server_trigger, server_trigger_poll, server_wasm_region};
105use sim_kernel::{
106    AbiVersion, Cx, Lib, LibManifest, LibTarget, Linker, Result, Symbol, Value, Version,
107};
108use stream_support::stream_handle_arg;
109use transport::shutdown_server_transport;
110
111/// The server [`Lib`] implementation, registering the server functions and CLI
112/// surface when loaded into a runtime.
113pub struct ServerLib;
114
115impl Lib for ServerLib {
116    fn manifest(&self) -> LibManifest {
117        LibManifest {
118            id: Symbol::new("server"),
119            version: Version(env!("CARGO_PKG_VERSION").to_owned()),
120            abi: AbiVersion { major: 0, minor: 1 },
121            target: LibTarget::HostRegistered,
122            requires: Vec::new(),
123            capabilities: Vec::new(),
124            exports: {
125                let mut exports = server_exports();
126                exports.extend(server_cli_exports());
127                exports
128            },
129        }
130    }
131
132    fn load(&self, cx: &mut sim_kernel::LoadCx, linker: &mut Linker<'_>) -> Result<()> {
133        register_server_functions(cx, linker)?;
134        register_server_cli(cx, linker)?;
135        Ok(())
136    }
137}
138
139/// Installs the server lib into `cx` exactly once, registering its functions
140/// and CLI exports.
141pub fn install_server_lib(cx: &mut Cx) -> Result<()> {
142    sim_lib_core::install_once(cx, &ServerLib).map(|_| ())
143}
144
145pub(crate) fn symbol_list_value(cx: &mut Cx, symbols: &[Symbol]) -> Result<Value> {
146    cx.factory().list(
147        symbols
148            .iter()
149            .cloned()
150            .map(|symbol| cx.factory().symbol(symbol))
151            .collect::<Result<Vec<_>>>()?,
152    )
153}
154
155#[cfg(test)]
156mod tests;