cua-spacesd-client

The async cua-spacesd client crate (native gRPC or gRPC-Web).

Public API of the cua-spacesd-client crate (cua_spacesd_client). Summaries and declarations only (cargo doc -p cua-spacesd-client --open in libs/cua has the full comments); see Rust crates for stability.

Ergonomic async client for cua-spacesd (cua.env.v1).

Modules#

  • diagnose: SystemService.Diagnose: client calls, and the ...
  • error: Typed errors.
  • expect: --expect COMPONENT=WANT: fail a doctor report unless ...
  • manifest: /etc/cua-image/manifest.json: what an image claims.
  • old_host: Calls to a host whose Cua is older than the RPC.
  • transport: Channel construction: native gRPC (HTTP/2, h2c or TLS) ...
  • tunnel: Client side of TunnelService.Forward: a loopback TCP ...

Types#

BearerProvider#

Supplies the gateway bearer (the relay's account ...

pub trait BearerProvider: Send + Sync {
  fn bearer(&self, force_refresh: bool) -> Pin<Box<dyn Future<Output = Result<String, BoxError>> + Send + '_>>;
  fn extra_headers(&self) -> Pin<Box<dyn Future<Output = Result<ExtraHeaders, BoxError>> + Send + '_>>;
}

ChannelError#

Transport-level failure of a GrpcChannel call.

pub struct ChannelError(pub BoxError);

Command#

A command to run.

pub struct Command {
  pub program: String,
  pub args: Vec<String>,
  pub env: BTreeMap<String, String>,
  pub cwd: Option<String>,
  pub user: Option<String>,
  pub timeout: Option<Duration>,
  pub tag: Option<String>,
  pub stdin: bool,
  pub pty: Option<(u32, u32)>,
  pub scrollback_bytes: u64,
  pub kill_on_disconnect: bool,
  pub keepalive: Option<Duration>,
  pub request_id: Option<String>,
  pub epoch: u64,
}
impl Command {
  fn new(program: impl Into<String>) -> Self;
  fn shell(line: impl Into<String>) -> Self;
  fn arg(self, a: impl Into<String>) -> Self;
  fn args<I, S>(self, args: I) -> Self where I: IntoIterator<Item = S>, S: Into<String>;
  fn env(self, k: impl Into<String>, v: impl Into<String>) -> Self;
  fn cwd(self, cwd: impl Into<String>) -> Self;
  fn user(self, user: impl Into<String>) -> Self;
  fn timeout(self, t: Duration) -> Self;
  fn tag(self, tag: impl Into<String>) -> Self;
  fn stdin(self, on: bool) -> Self;
  fn pty(self, cols: u32, rows: u32) -> Self;
  fn keepalive(self, interval: Duration) -> Self;
  fn scrollback(self, bytes: u64) -> Self;
  fn request_id(self, key: impl Into<String>) -> Self;
  fn epoch(self, epoch: u64) -> Self;
}

ConnectOptions#

Options for SpacesdClient::connect.

pub struct ConnectOptions {
  pub endpoint: Endpoint,
  pub token: Option<String>,
  pub principal: Option<Principal>,
  pub transport: TransportPreference,
  pub gateway: Option<GatewayAuth>,
  pub connect_timeout: Duration,
  pub probe_timeout: Duration,
  pub start_timeout: Duration,
  pub keepalive: Keepalive,
  pub retry: RetryPolicy,
  pub probe: bool,
  pub headers: Vec<(String, String)>,
}
impl ConnectOptions {
  fn new(endpoint: Endpoint) -> Self;
  fn parse(endpoint: &str) -> Result<Self>;
  fn token(self, token: impl Into<String>) -> Self;
  fn principal(self, principal: Principal) -> Self;
  fn transport(self, transport: TransportPreference) -> Self;
  fn gateway(self, bearer: Arc<dyn BearerProvider>) -> Self;
  fn retry(self, retry: RetryPolicy) -> Self;
  fn keepalive(self, keepalive: Keepalive) -> Self;
  fn probe_timeout(self, timeout: Duration) -> Self;
  fn start_timeout(self, timeout: Duration) -> Self;
  fn header(self, name: impl Into<String>, value: impl Into<String>) -> Self;
  fn probe(self, probe: bool) -> Self;
}

DesktopReadiness#

Desktop readiness, from SpacesdClie ...

pub struct DesktopReadiness {
  pub ready: bool,
  pub detail: String,
  pub reported: bool,
}

diagnose::Artifact#

Evidence produced by a check.

pub struct Artifact {
  pub name: String,
  pub media_type: String,
  pub data: Vec<u8>,
  pub path: String,
}

diagnose::Check#

The result of one check.

pub struct Check {
  pub id: String,
  pub group: String,
  pub status: Status,
  pub severity: Severity,
  pub claimed_by: Vec<String>,
  pub message: String,
  pub remediation: String,
  pub duration_ms: u32,
  pub facts: BTreeMap<String, String>,
  pub artifacts: Vec<Artifact>,
}
impl Check {
  fn new(id: impl Into<String>, status: Status, message: impl Into<String>) -> Self;
  fn fact(self, key: impl Into<String>, value: impl ToString) -> Self;
  fn fix(self, remediation: impl Into<String>) -> Self;
  fn skip_reason(self, reason: &str) -> Self;
  fn to_pb(&self) -> DiagnoseCheck;
}

diagnose::Effects#

Which checks may act on the guest.

pub enum Effects {
  None,
  VirtualOnly,
}
impl Effects {
  fn parse(value: &str) -> Option<Self>;
  fn to_pb(self) -> DiagnoseEffects;
  fn from_pb(value: i32) -> Self;
}

diagnose::Environment#

Where the guest runs.

pub struct Environment {
  pub runtime: String,
  pub runtime_detail: String,
  pub arch: String,
  pub init: String,
  pub display_server: String,
  pub os: String,
}

diagnose::Fidelity#

Facts that change task behaviour between variants.

pub struct Fidelity {
  pub display: String,
  pub fonts_sha256: String,
  pub tz: String,
  pub locale: String,
  pub clock_skew_ms: i64,
  pub encoder: String,
  pub a11y_backend: String,
  pub audio_backend: String,
  pub cpu_model: String,
  pub cpu_count: u32,
  pub memory_mib: u64,
  pub gpu: String,
  pub kernel: String,
  pub runtime: String,
  pub init: String,
  pub packages_sha256: String,
  pub app_versions: BTreeMap<String, String>,
  pub tool_versions: BTreeMap<String, String>,
  pub simulator_runtimes: Vec<String>,
}
impl Fidelity {
  fn flatten(&self) -> BTreeMap<String, String>;
}

diagnose::Image#

The image under test.

pub struct Image {
  pub name: String,
  pub reference: String,
  pub variant: String,
  pub os: String,
  pub manifest_sha256: String,
  pub manifest_source: String,
}

diagnose::Report#

A whole report, JSON schema version 1.

pub struct Report {
  pub schema_version: u32,
  pub producer: String,
  pub started_at: Option<Timestamp>,
  pub spacesd: Option<Spacesd>,
  pub image: Image,
  pub environment: Environment,
  pub summary: Summary,
  pub checks: Vec<Check>,
  pub fidelity: Fidelity,
}
impl Report {
  fn from_json(text: &str) -> Result<Self, String>;
  fn to_json(&self) -> String;
  fn from_pb(report: DiagnoseReport) -> Self;
  fn to_pb(&self) -> DiagnoseReport;
  fn finalize(&mut self, strict: bool, duration: Duration);
  fn exit_code(&self) -> i32;
  fn to_human(&self) -> String;
  fn to_junit(&self) -> String;
}

diagnose::Severity#

How much a check matters for the image, from its ...

pub enum Severity {
  Required,
  Recommended,
  Info,
}
impl Severity {
  fn as_str(self) -> &'static str;
}

diagnose::Spacesd#

The daemon that ran the checks.

pub struct Spacesd {
  pub version: String,
  pub protocol_revision: u32,
  pub git_sha: String,
  pub cua_driver_version: String,
}

diagnose::Status#

Outcome of one check.

pub enum Status {
  Pass,
  Warn,
  Fail,
  Skip,
}
impl Status {
  fn as_str(self) -> &'static str;
}

diagnose::Summary#

Totals.

pub struct Summary {
  pub status: Status,
  pub pass: u32,
  pub warn: u32,
  pub fail: u32,
  pub skip: u32,
  pub duration_ms: u32,
  pub strict: bool,
}

DownloadOptions#

Download options.

pub struct DownloadOptions {
  pub offset: u64,
  pub length: u64,
  pub chunk_size: u32,
  pub progress: Option<Arc<AtomicU64>>,
  pub run_as: Option<String>,
}

DownloadResult#

Result of a download to a sink.

pub struct DownloadResult {
  pub size: u64,
  pub sha256: String,
  pub resumes: u32,
}

DownloadSink#

Destination of a download.

pub trait DownloadSink: Send {
  fn write(&mut self, chunk: Bytes) -> impl Future<Output = Result<()>> + Send;
  fn size_hint(&mut self, _bytes: u64);
}

EgressPolicy#

What a guest may reach.

pub struct EgressPolicy {
  pub block_all: bool,
  pub allow_cidrs: Vec<String>,
  pub allow_domains: Vec<String>,
}
impl EgressPolicy {
  fn open() -> Self;
  fn is_open(&self) -> bool;
  fn validate(&self) -> Result<EgressPolicy>;
  fn script(&self) -> Result<String>;
}

Endpoint#

A parsed spacesd endpoint: an absolute base URL ...

pub struct Endpoint { /* private fields */ }
impl Endpoint {
  fn parse(input: &str) -> Result<Self>;
  fn base_url(&self) -> &Url;
  fn kind(&self) -> &EndpointKind;
  fn path_prefix(&self) -> &str;
  fn is_tls(&self) -> bool;
  fn host(&self) -> &str;
  fn port(&self) -> u16;
  fn origin(&self) -> String;
  fn http_url(&self, path: &str) -> String;
  fn ws_url(&self, path: &str) -> String;
}

EndpointKind#

How the endpoint is reached.

pub enum EndpointKind {
  Direct,
  Relay { machine_id: String },
}

Error#

Every error the env client can return.

pub enum Error {
  InvalidEndpoint(String),
  Transport(String),
  SpacesdNotAvailable { endpoint: String, reason: String },
  Unauthenticated(ErrorDetails),
  FeatureUnsupported { feature: String, details: ErrorDetails },
  PermissionDenied(ErrorDetails),
  StaleHandle(ErrorDetails),
  StaleGeometry(ErrorDetails),
  StaleSnapshot(ErrorDetails),
  WouldRequireActivation(ErrorDetails),
  TargetUnavailable(ErrorDetails),
  DeliveryFailed(ErrorDetails),
  ProcessNotFound(ErrorDetails),
  PathNotFound(ErrorDetails),
  PathExists(ErrorDetails),
  NotADirectory(ErrorDetails),
  IsADirectory(ErrorDetails),
  DiskFull(ErrorDetails),
  ChecksumMismatch { expected: String, actual: String },
  SessionNotFound(ErrorDetails),
  OffsetMismatch { expected_offset: Option<u64>, details: ErrorDetails },
  SequenceGap { expected_sequence: Option<u64>, details: ErrorDetails },
  RateLimited { retry_after: Option<Duration>, details: ErrorDetails },
  LimitExceeded(ErrorDetails),
  NotInitialized(ErrorDetails),
  Internal(ErrorDetails),
  Rpc(ErrorDetails),
  Timeout(Duration),
  DesktopNotReady(String),
  Protocol(String),
  Io(Error),
}
impl Error {
  fn code(&self) -> Option<Code>;
  fn details(&self) -> Option<&ErrorDetails>;
  fn is_retryable(&self) -> bool;
}

error::RpcStatus#

google.rpc.Status (the payload of ...

pub struct RpcStatus {
  pub code: i32,
  pub message: String,
  pub details: Vec<Any>,
}

ErrorDetails#

Context shared by every RPC error variant.

pub struct ErrorDetails {
  pub code: i32,
  pub message: String,
  pub metadata: HashMap<String, String>,
}

ExitStatus#

How a process ended.

pub struct ExitStatus {
  pub code: Option<i32>,
  pub signal: Option<Signal>,
  pub signal_number: Option<i32>,
  pub signal_name: Option<String>,
  pub timed_out: bool,
  pub error: Option<String>,
}
impl ExitStatus {
  fn success(&self) -> bool;
}

expect::Expectation#

One COMPONENT=WANT.

pub struct Expectation {
  pub component: String,
  pub want: Want,
}

expect::Instance#

One running build of a component, as the guest reported ...

pub struct Instance {
  pub label: String,
  pub version: String,
  pub git_sha: String,
  pub exe_sha256: String,
}

expect::Want#

What to compare.

pub enum Want {
  Sha256(String),
  Git(String),
  Version(String),
}

FileAccess#

Who a file call acts as and which extended-attribute ...

pub struct FileAccess {
  pub run_as: Option<String>,
  pub xattr_namespace: Option<String>,
}
impl FileAccess {
  fn user(user: impl Into<String>) -> Self;
}

ForwardOptions#

Options for SpacesdClient::forward_tcp.

pub struct ForwardOptions {
  pub port: u16,
  pub host: String,
  pub bind: SocketAddr,
  pub ttl: Option<Duration>,
  pub max_connections: usize,
}
impl ForwardOptions {
  fn new(port: u16) -> Self;
  fn bind(self, bind: SocketAddr) -> Self;
}

ForwardStats#

Counters of a TcpForward.

pub struct ForwardStats {
  pub connections: AtomicU64,
  pub active: AtomicU64,
  pub bytes_to_guest: AtomicU64,
  pub bytes_from_guest: AtomicU64,
  pub failed: AtomicU64,
}

GatewayAuth#

Gateway credentials: the bearer a relay-style gateway ...

pub struct GatewayAuth {
  pub bearer: Arc<dyn BearerProvider>,
}

HttpCall#

One HTTP request to the spacesd.

pub struct HttpCall {
  pub method: String,
  pub path: String,
  pub headers: Vec<(String, String)>,
  pub body: Vec<u8>,
  pub timeout: Option<Duration>,
  pub max_response_bytes: Option<usize>,
}

HttpReply#

The spacesd's answer.

pub struct HttpReply {
  pub status: u16,
  pub headers: Vec<(String, String)>,
  pub body: Vec<u8>,
}

Keepalive#

Connection-level keepalive settings.

pub struct Keepalive {
  pub interval: Duration,
  pub timeout: Duration,
}

KeySpec#

A key: named ("enter", "KEY_ENTER" ...

pub enum KeySpec {
  Named(Key),
  Char(String),
}
impl KeySpec {
  fn parse(name: &str) -> Result<Self>;
  fn to_pb(&self) -> KeyInput;
}

manifest::AudioClaim#

Audio plumbing.

pub struct AudioClaim {
  pub server: String,
  pub default_sink: String,
  pub default_source: String,
  pub uplink_input_sink: String,
}

A compatibility alias.

pub struct CompatLink {
  pub path: String,
  pub target: String,
  pub unit_alias: String,
  pub unit: String,
}

manifest::DisplayClaim#

The desktop session.

pub struct DisplayClaim {
  pub name: String,
  pub resolution: String,
  pub user: String,
}
impl DisplayClaim {
  fn size(&self) -> Option<(u32, u32)>;
}

manifest::Fixtures#

Conformance fixtures shipped in the image.

pub struct Fixtures {
  pub root: String,
  pub apps: Vec<String>,
}
impl Fixtures {
  fn has(&self, name: &str) -> bool;
}

manifest::LaunchApp#

The app LaunchApp must start.

pub struct LaunchApp {
  pub app: String,
  pub args: Vec<String>,
  pub window_match: String,
  pub timeout_s: u32,
  pub limits: Vec<LaunchAppLimit>,
}
impl LaunchApp {
  fn limit_for(&self, runtime: &str, arch: &str) -> Option<&LaunchAppLimit>;
}

manifest::LaunchAppLimit#

A runtime and architecture where LaunchApp::app ...

pub struct LaunchAppLimit {
  pub runtime: String,
  pub arch: String,
  pub reason: String,
  pub instead: Option<Box<LaunchApp>>,
}

manifest::Loaded#

A loaded manifest with its provenance.

pub struct Loaded {
  pub manifest: Manifest,
  pub source: String,
  pub sha256: String,
  pub error: Option<String>,
}
impl Loaded {
  fn present(&self) -> bool;
  fn parse(bytes: &[u8], source: &str) -> Self;
  fn read(path: &Path) -> Self;
  fn severity(&self, claims: &[&str]) -> Severity;
}

manifest::Manifest#

The image's claims.

pub struct Manifest {
  pub schema_version: u32,
  pub name: String,
  pub aliases: Vec<String>,
  pub os: String,
  pub variant: String,
  pub init: String,
  pub arch: String,
  pub reference: String,
  pub source_revision: String,
  pub annotations: BTreeMap<String, String>,
  pub spacesd: SpacesdClaim,
  pub features_required: Vec<String>,
  pub features_optional: Vec<String>,
  pub features_not_applicable: Vec<String>,
  pub feature_attributes: BTreeMap<String, BTreeMap<String, String>>,
  pub codecs_required: Vec<String>,
  pub auth_modes: Vec<String>,
  pub services: Vec<ServiceClaim>,
  pub units: Vec<String>,
  pub unit_processes: BTreeMap<String, String>,
  pub display: DisplayClaim,
  pub fixtures: Fixtures,
  pub audio: AudioClaim,
  pub compat_links: Vec<CompatLink>,
  pub tier: String,
  pub apps: BTreeMap<String, SoftwareClaim>,
  pub tools: BTreeMap<String, SoftwareClaim>,
  pub simulator_runtimes: Vec<String>,
  pub launch_app: Option<LaunchApp>,
  pub parity: Parity,
  pub resources: Resources,
  pub tz: String,
  pub locale: String,
  pub dns_probe: String,
  pub av_skew_budget_ms: BTreeMap<String, u32>,
}
impl Manifest {
  fn is_named(&self, name: &str) -> bool;
  fn requires(&self, feature: &str) -> bool;
  fn allows(&self, feature: &str) -> bool;
  fn not_applicable(&self, feature: &str) -> bool;
  fn lists(&self, feature: &str) -> bool;
  fn av_skew_budget(&self, runtime: &str) -> u32;
}

manifest::Parity#

Parity settings.

pub struct Parity {
  pub expected_diff: Vec<String>,
}

manifest::Resources#

Resource floors.

pub struct Resources {
  pub min_disk_gib: f64,
  pub min_shm_mib: u64,
  pub min_memory_mib: u64,
}

manifest::ServiceClaim#

A network service the image serves.

pub struct ServiceClaim {
  pub name: String,
  pub port: u16,
  pub protocol: String,
  pub component: String,
  pub readiness: String,
}

manifest::SoftwareClaim#

A claimed app or tool: its version command, as a bare ...

pub enum SoftwareClaim {
  Argv(Vec<String>),
  Spec { argv: Vec<String>, expect: String },
}
impl SoftwareClaim {
  fn argv(&self) -> &[String];
  fn expect(&self) -> &str;
}

manifest::SpacesdClaim#

The baked cua-spacesd, from cua-spacesd build-info at ...

pub struct SpacesdClaim {
  pub present: bool,
  pub source: String,
  pub path: String,
  pub version: String,
  pub protocol_revision: u32,
  pub git_sha: String,
  pub cua_driver_version: String,
  pub tools_sha256: String,
  pub tools_count: u32,
  pub codecs_compiled: Vec<String>,
}

MediaOptions#

Options for SpacesdClient::open_media.

pub struct MediaOptions {
  pub display: Option<String>,
  pub window: Option<WindowRef>,
  pub codecs: Vec<MediaCodec>,
  pub max_fps: u32,
  pub max_dimension: u32,
  pub ticket_ttl: Option<Duration>,
  pub prefer_quic: bool,
  pub audio: Option<AudioOptions>,
  pub disable_video: bool,
}

MediaSession#

A media session ready for the rcdp wire.

pub struct MediaSession {
  pub session_id: String,
  pub ticket: String,
  pub ws_url: String,
  pub raw: OpenMediaResponse,
}

old_host::OldHost#

How a host that is too old for the RPC describes itself.

pub struct OldHost {
  pub version: String,
  pub revision: u32,
}

Output#

Collected result of SpacesdClient::run.

pub struct Output {
  pub status: ExitStatus,
  pub stdout: Vec<u8>,
  pub stderr: Vec<u8>,
  pub pty: Vec<u8>,
}
impl Output {
  fn success(&self) -> bool;
  fn stdout_str(&self) -> String;
  fn stderr_str(&self) -> String;
}

ProcessEvent#

One output chunk or the exit.

pub enum ProcessEvent {
  Stdout { offset: u64, data: Bytes },
  Stderr { offset: u64, data: Bytes },
  Pty { offset: u64, data: Bytes },
  Exit(ExitStatus),
}

ProcessHandle#

A running (or exited) guest process.

pub struct ProcessHandle { /* private fields */ }
impl ProcessHandle {
  fn pid(&self) -> u32;
  fn tag(&self) -> Option<&str>;
  fn via_sudo(&self) -> bool;
  fn keepalives_seen(&self) -> u64;
  fn reconnects(&self) -> u64;
  fn dropped_bytes(&self) -> u64;
  fn output_offset(&self) -> u64;
  async fn next_event(&mut self) -> Result<Option<ProcessEvent>>;
  async fn wait(self) -> Result<Output>;
  fn detach(self);
  async fn write_stdin(&self, data: impl Into<Bytes>) -> Result<()>;
  async fn write_pty(&self, data: impl Into<Bytes>) -> Result<()>;
  async fn close_stdin(&self) -> Result<()>;
  async fn signal(&self, signal: Signal) -> Result<()>;
  async fn kill(&self) -> Result<()>;
  async fn signal_group(&self, signal: Signal) -> Result<()>;
  async fn resize(&self, cols: u32, rows: u32) -> Result<()>;
}

ProcessRef#

Identifies a process to attach to.

pub enum ProcessRef {
  Pid(u32),
  Tag(String),
}

Recorded#

A finished recording.

pub struct Recorded {
  pub path: PathBuf,
  pub frames: u64,
  pub seconds: f64,
  pub bytes: u64,
}

RecordOptions#

What to record.

pub struct RecordOptions {
  pub fps: u32,
  pub out: PathBuf,
  pub max_dimension: u32,
  pub include_cursor: bool,
}
impl RecordOptions {
  fn new(out: impl Into<PathBuf>) -> Self;
}

Replay#

Scrollback replay when attaching.

pub enum Replay {
  None,
  LastBytes(u64),
  All,
  FromOffset(u64),
}

RetryPolicy#

Exponential backoff for reconnects and idempotent ...

pub struct RetryPolicy {
  pub max_attempts: u32,
  pub initial_backoff: Duration,
  pub max_backoff: Duration,
}
impl RetryPolicy {
  fn backoff(&self, attempt: u32) -> Duration;
  async fn run<T, F, Fut>(&self, op: F) -> Result<T> where F: FnMut(u32) -> Fut, Fut: Future<Output = Result<T>>;
}

RunAsMode#

How the guest agent switches to another user, from the ...

pub enum RunAsMode {
  Root,
  Capabilities,
  Sudo,
  None,
  Unknown,
}
impl RunAsMode {
  fn is_native(self) -> bool;
}

ScreenRecording#

A running recording.

pub struct ScreenRecording { /* private fields */ }
impl ScreenRecording {
  fn frames(&self) -> u64;
  async fn stop(self) -> Result<Recorded>;
}

Screenshot#

A captured screenshot.

pub struct Screenshot {
  pub image: Bytes,
  pub format: ImageFormat,
  pub width: u32,
  pub height: u32,
  pub scale: f64,
  pub screenshot_id: String,
  pub raw: ScreenshotResponse,
}

ScreenshotOptions#

Screenshot options.

pub struct ScreenshotOptions {
  pub display: Option<String>,
  pub format: ImageFormat,
  pub quality: u32,
  pub max_dimension: u32,
  pub include_cursor: bool,
}

SpacesdClient#

Async client for one cua-spacesd.

pub struct SpacesdClient { /* private fields */ }
impl SpacesdClient {
  async fn attach_bulk(&self, path: impl AsRef<Path>) -> bool;
  fn bulk_attached(&self) -> bool;
  async fn connect_url(endpoint: &str, token: Option<String>) -> Result<Self>;
  async fn connect(options: ConnectOptions) -> Result<Self>;
  fn token(&self) -> Option<&str>;
  fn endpoint(&self) -> &Endpoint;
  fn transport(&self) -> Transport;
  fn retry_policy(&self) -> RetryPolicy;
  fn channel(&self) -> GrpcChannel;
  fn system(&self) -> SystemServiceClient<GrpcChannel>;
  fn process(&self) -> ProcessServiceClient<GrpcChannel>;
  fn filesystem(&self) -> FilesystemServiceClient<GrpcChannel>;
  fn computer(&self) -> ComputerServiceClient<GrpcChannel>;
  fn windows(&self) -> WindowsServiceClient<GrpcChannel>;
  fn accessibility(&self) -> AccessibilityServiceClient<GrpcChannel>;
  fn driver(&self) -> DriverServiceClient<GrpcChannel>;
  fn stream(&self) -> StreamServiceClient<GrpcChannel>;
  fn presence(&self) -> PresenceServiceClient<GrpcChannel>;
  fn teleport(&self) -> TeleportServiceClient<GrpcChannel>;
  fn tunnel(&self) -> TunnelServiceClient<GrpcChannel>;
  fn volume(&self) -> VolumeServiceClient<GrpcChannel>;
  fn host_spaces(&self) -> HostSpacesServiceClient<GrpcChannel>;
  fn host_snapshots(&self) -> HostSnapshotsServiceClient<GrpcChannel>;
  fn host_thread(&self) -> HostThreadServiceClient<GrpcChannel>;
  async fn capabilities(&self) -> Result<GetCapabilitiesResponse>;
  async fn refresh_capabilities(&self) -> Result<GetCapabilitiesResponse>;
  async fn machine_seal_public_key(&self) -> Result<Option<[u8; 32]>>;
  async fn has_feature(&self, feature: &str) -> Result<bool>;
  async fn init(&self, request: InitRequest) -> Result<InitResponse>;
  async fn health(&self) -> Result<HealthResponse>;
  async fn metrics(&self) -> Result<MetricsResponse>;
  async fn chunk_limits(&self) -> (usize, usize);
  async fn screenshot(&self, options: ScreenshotOptions) -> Result<Screenshot>;
  async fn pointer(&self, target: Option<InputTarget>, action: PtrAction) -> Result<PointerResponse>;
  async fn click(&self, x: f64, y: f64) -> Result<PointerResponse>;
  async fn double_click(&self, x: f64, y: f64) -> Result<PointerResponse>;
  async fn right_click(&self, x: f64, y: f64) -> Result<PointerResponse>;
  async fn click_with(&self, x: f64, y: f64, button: MouseButton, count: u32) -> Result<PointerResponse>;
  async fn move_to(&self, x: f64, y: f64) -> Result<PointerResponse>;
  async fn scroll(&self, dx: f64, dy: f64) -> Result<PointerResponse>;
  async fn drag(&self, from: (f64, f64), to: (f64, f64)) -> Result<PointerResponse>;
  async fn keyboard(&self, target: Option<InputTarget>, action: KbAction) -> Result<KeyboardResponse>;
  async fn type_text(&self, text: &str) -> Result<KeyboardResponse>;
  async fn press(&self, key: impl TryInto<KeySpec, Error = Error>) -> Result<KeyboardResponse>;
  async fn hotkey(&self, keys: &[&str]) -> Result<KeyboardResponse>;
  async fn get_clipboard(&self) -> Result<Option<String>>;
  async fn set_clipboard(&self, text: &str) -> Result<u64>;
  async fn cursor_position(&self) -> Result<(f64, f64)>;
  async fn displays(&self) -> Result<Vec<Display>>;
  async fn desktop_readiness(&self) -> Result<DesktopReadiness>;
  async fn wait_desktop_ready(&self, timeout: Duration) -> Result<DesktopReadiness>;
  async fn open_media(&self, options: MediaOptions) -> Result<MediaSession>;
  async fn diagnose(&self, options: DiagnoseOptions) -> Result<DiagnoseStream>;
  async fn diagnose_once(&self, options: DiagnoseOptions) -> Result<Report>;
  async fn diagnose_report(&self, options: DiagnoseOptions, on_check: impl FnMut(&Check)) -> Result<Report>;
  async fn set_egress(&self, policy: &EgressPolicy) -> Result<()>;
  async fn upload(&self, path: &str, source: impl Into<UploadSource>, options: UploadOptions) -> Result<UploadResult>;
  async fn download(&self, path: &str) -> Result<Bytes>;
  async fn download_vec(&self, path: &str) -> Result<Vec<u8>>;
  async fn download_to_file(&self, path: &str, local: &Path, options: DownloadOptions) -> Result<DownloadResult>;
  async fn download_with<S: DownloadSink>(&self, path: &str, options: DownloadOptions, sink: &mut S) -> Result<DownloadResult>;
  async fn require_file_features(&self, run_as: Option<&str>, metadata: bool) -> Result<()>;
  async fn stat(&self, path: &str) -> Result<EntryInfo>;
  async fn stat_with(&self, path: &str, no_follow: bool, access: &FileAccess) -> Result<EntryInfo>;
  async fn list_dir(&self, path: &str, depth: u32) -> Result<Vec<EntryInfo>>;
  async fn list_dir_with(&self, path: &str, depth: u32, access: &FileAccess) -> Result<Vec<EntryInfo>>;
  async fn make_dir(&self, path: &str) -> Result<EntryInfo>;
  async fn make_dir_with(&self, path: &str, access: &FileAccess) -> Result<EntryInfo>;
  async fn remove(&self, path: &str, recursive: bool) -> Result<()>;
  async fn remove_with(&self, path: &str, recursive: bool, access: &FileAccess) -> Result<()>;
  async fn move_path(&self, source: &str, destination: &str, overwrite: bool, create_parents: bool, access: &FileAccess) -> Result<EntryInfo>;
  async fn http(&self, call: HttpCall) -> Result<HttpReply>;
  async fn spawn(&self, cmd: impl Into<Command>) -> Result<ProcessHandle>;
  async fn run_as_mode(&self) -> RunAsMode;
  async fn kill_tree(&self, pid: u32, via_sudo: bool) -> Result<()>;
  async fn run(&self, cmd: impl Into<Command>) -> Result<Output>;
  async fn attach(&self, selector: ProcessRef, replay: Replay) -> Result<ProcessHandle>;
  async fn signal_group(&self, selector: ProcessRef, signal: Signal) -> Result<()>;
  async fn list_processes(&self, include_exited: bool) -> Result<Vec<ProcessInfo>>;
  async fn record_screen(&self, opts: RecordOptions) -> Result<ScreenRecording>;
  async fn supports_tunnel_forward(&self) -> Result<bool>;
  async fn forward_tcp(&self, options: ForwardOptions) -> Result<TcpForward>;
  async fn open_websocket(&self, ws_path: &str) -> Result<WebSocketStream<MaybeTlsStream<TcpStream>>>;
}

StaticBearer#

A static bearer.

pub struct StaticBearer(pub String);

TcpForward#

A running TCP forward.

pub struct TcpForward { /* private fields */ }
impl TcpForward {
  fn local_addr(&self) -> SocketAddr;
  fn guest_port(&self) -> u16;
  async fn forward_id(&self) -> String;
  fn stats(&self) -> &ForwardStats;
  async fn close(self) -> Result<()>;
}

Transport#

The protocol a connected client actually uses.

pub enum Transport {
  Native,
  GrpcWeb,
}

transport::GrpcWebFrames#

Re-chunks a binary gRPC-Web response body so every ...

pub struct GrpcWebFrames<B> { /* private fields */ }

TransportPreference#

Wire protocol.

pub enum TransportPreference {
  Auto,
  Native,
  GrpcWeb,
}

UploadOptions#

Upload options.

pub struct UploadOptions {
  pub mode: WriteMode,
  pub permissions: u32,
  pub create_parents: bool,
  pub chunk_size: usize,
  pub resumable: Option<bool>,
  pub upload_id: Option<String>,
  pub ttl: Option<Duration>,
  pub progress: Option<Arc<AtomicU64>>,
  pub run_as: Option<String>,
  pub metadata: BTreeMap<String, String>,
  pub xattr_namespace: Option<String>,
}

UploadResult#

Result of an upload.

pub struct UploadResult {
  pub entry: Option<EntryInfo>,
  pub sha256: String,
  pub size: u64,
  pub resumable: bool,
  pub resumes: u32,
}

UploadSource#

What to upload.

pub enum UploadSource {
  Bytes(Bytes),
  File(PathBuf),
}

Functions#

/// The `ffmpeg` to use.
pub fn find_ffmpeg() -> Option<PathBuf>
/// Sets the principal every client in this ...
pub fn set_process_principal(principal: Option<Principal>)
 
// mod diagnose
/// Encodes artifact bytes for display ...
pub fn encode_artifact(data: &[u8]) -> String
/// SHA-256 over the tool registry's ...
pub fn tools_sha256(tools: &[ToolInfo]) -> String
 
// mod error
/// Decodes `ErrorInfo` from a status, if ...
pub fn error_info(status: &Status) -> Option<ErrorInfo>
/// Maps a `tonic::Status` into a typed ...
pub fn from_status(status: &Status) -> Error
/// True when `status` is HTTP/2 flood ...
pub fn is_h2_flood_goaway(status: &Status) -> bool
/// One human-readable line for a status ...
pub fn status_text(status: &Status) -> String
/// Builds a `tonic::Status` carrying ...
pub fn status_with_info(code: Code, info: ErrorInfo) -> Status
/// Shorthand for `status_with_info` with a ...
pub fn status_with_reason(code: Code, reason: ErrorReason, message: impl Into<String>, metadata: impl IntoIterator<Item = (String, String)>) -> Status
/// The innermost cause of a status raised ...
pub fn transport_cause(status: &Status) -> Option<String>
 
// mod expect
/// Appends one required `expect.*` check ...
pub fn apply(report: &mut Report, expectations: &[Expectation])
/// The expect.<compone ...
pub fn evaluate_one(report: &Report, expectation: &Expectation) -> Check
/// The running instances of `component` ...
pub fn instances(report: &Report, component: &str) -> Vec<Instance>
/// Parses every spec, failing on the first ...
pub fn parse_all(specs: &[String]) -> Result<Vec<Expectation>, String>
 
// mod manifest
/// Where an image built for this platform ...
pub fn local_path() -> &'static str
 
// mod old_host
/// Whether `e` is what a host answers for ...
pub fn is_unknown_rpc(e: &Error) -> bool
/// The refusal for `what` (for example ...
pub fn message(host: &str, old: Option<&OldHost>, what: &str) -> String
/// `Some` when `caps` (a host's ...
pub fn too_old(caps: &GetCapabilitiesResponse) -> Option<OldHost>
 
// mod transport
/// Install rustls' `ring` provider as the ...
pub fn ensure_crypto_provider()

Constants#

/// Default chunk size for bulk transfer ...
pub const DEFAULT_CHUNK_BYTES: usize = _;
/// Default cap on a response body.
pub const DEFAULT_HTTP_RESPONSE_LIMIT: usize = _;
/// Timeout when the caller sets none.
pub const DEFAULT_HTTP_TIMEOUT: Duration = _;
/// Default server-side keepalive interval ...
pub const DEFAULT_PROCESS_KEEPALIVE: Duration = _;
/// Name of the `SystemService.Health` ...
pub const DESKTOP_COMPONENT: &str = "desktop";
/// Largest request body ...
pub const MAX_HTTP_REQUEST_BYTES: usize = _;
/// Largest message the client accepts ...
pub const MAX_MESSAGE_BYTES: usize = _;
/// Capability: `ProcessConfig.user` (and ...
pub const PROCESS_RUN_AS_FEATURE: &str = "process.run_as";
/// How long a start waits for ...
pub const PROCESS_START_DEADLINE: Duration = _;
/// Capability: file calls accept `run_as` ...
pub const RUN_AS_FEATURE: &str = "fs.run_as";
/// Capability name a spacesd advertises ...
pub const TUNNEL_FORWARD_FEATURE: &str = "tunnel.forward";
/// Capability: writes accept `metadata` ...
pub const XATTR_FEATURE: &str = "fs.xattr";
 
// mod diagnose
/// Most events a `Diagnose` stream may ...
pub const MAX_EVENTS: usize = 10_000;
/// Largest artifact inlined into a report ...
pub const MAX_INLINE_ARTIFACT_BYTES: usize = _;
/// `DiagnoseReport.schema_version` this ...
pub const SCHEMA_VERSION: u32 = cua_proto::DIAGNOSE_REPORT_SCHEMA_VERSION;
/// Skip reasons that `strict` accepts on a ...
pub const STRICT_ALLOWED_SKIPS: &[&str] = _;
 
// mod error
/// Type URL of a packed ...
pub const ERROR_INFO_TYPE_URL: &str = "type.googleapis.com/cua.env.v1.ErrorInfo";
 
// mod expect
/// The id of the guest check that carries ...
pub const IDENTITY_CHECK: &str = "build.identity";
 
// mod manifest
/// Default location inside a Linux or ...
pub const DEFAULT_PATH: &str = "/etc/cua-image/manifest.json";
/// Manifest schema version this doctor ...
pub const SCHEMA_VERSION: u32 = 1;
/// Location inside a Windows image ...
pub const WINDOWS_PATH: &str = r"C:\ProgramData\cua-image\manifest.json";
 
// mod transport
/// HTTP/2 receive window per connection ...
pub const CONNECTION_WINDOW: u32 = _;
/// Header carrying the spacesd token when ...
pub const ENV_TOKEN_HEADER: &str = "x-cua-env-authorization";
/// Largest HTTP/2 frame this client ...
pub const MAX_FRAME: u32 = _;
/// HTTP/2 receive window per stream ...
pub const STREAM_WINDOW: u32 = _;
 
// mod tunnel
/// Default cap on concurrently relayed ...
pub const DEFAULT_MAX_CONNECTIONS: usize = 256;
/// Largest WebSocket message accepted from ...
pub const MAX_TUNNEL_MESSAGE_BYTES: usize = _;
/// Bytes read from the local socket per ...
pub const RELAY_CHUNK_BYTES: usize = _;

Type aliases#

/// Extra request headers a ...
pub type ExtraHeaders = Vec<(String, String)>;
/// The boxed channel every generated ...
pub type GrpcChannel = BoxCloneSyncService<Request<Body>, Response<Body>, ChannelError>;
/// Result alias.
pub type Result<T, E = Error> = Result<T, E>;
 
// mod diagnose
/// A server-streamed `Diagnose` run.
pub type DiagnoseStream = Streaming<DiagnoseResponse>;
 
// mod error
/// Boxed error used by transports.
pub type BoxError = Box<dyn Error + Send + Sync + 'static>;

Re-exports#

cua_proto::env::v1.