Computer and media

Screenshots, pointer, keyboard, clipboard and displays of a sandbox desktop, and its video and audio streams.

Coordinates are screen pixels. cua-spacesd delegates input to Cua Driver in the guest; these calls need an image with a desktop.

Python programs usually use the high-level API instead: sb.mouse, sb.keyboard, sb.screen.

Desktop methods#

Methods of SpacesdClient.

SpacesdClient.screenshot#

Captures a display.

async def screenshot(self, options: Optional[ScreenshotOptions]) -> Screenshot
ParameterTypeDefault
optionsOption<ScreenshotOptions>required

Returns Screenshot · Async · Raises CuaError

Example

import asyncio
 
import cua
 
async def main():
    guest = await cua.embedded().spacesd(URL, TOKEN)
    shot = await guest.screenshot(None)  # PNG by default
    await guest.click(shot.width / 2, shot.height / 2)
    print([shot.width > 0, shot.image[:4]])
    # [True, b'\x89PNG']
 
asyncio.run(main())

SpacesdClient.click#

Left click.

async def click(self, x: float, y: float) -> None
ParameterTypeDefault
xf64required
yf64required

Async · Raises CuaError

SpacesdClient.double_click#

Double click.

async def double_click(self, x: float, y: float) -> None
ParameterTypeDefault
xf64required
yf64required

Async · Raises CuaError

SpacesdClient.right_click#

Right click.

async def right_click(self, x: float, y: float) -> None
ParameterTypeDefault
xf64required
yf64required

Async · Raises CuaError

SpacesdClient.move_to#

Moves the pointer.

async def move_to(self, x: float, y: float) -> None
ParameterTypeDefault
xf64required
yf64required

Async · Raises CuaError

SpacesdClient.drag#

Drags with the left button.

async def drag(self, from_x: float, from_y: float, to_x: float, to_y: float) -> None
ParameterTypeDefault
from_xf64required
from_yf64required
to_xf64required
to_yf64required

Async · Raises CuaError

SpacesdClient.scroll#

Scrolls by line deltas.

async def scroll(self, dx: float, dy: float) -> None
ParameterTypeDefault
dxf64required
dyf64required

Async · Raises CuaError

SpacesdClient.type_text#

Types text.

async def type_text(self, text: str) -> None
ParameterTypeDefault
textStringrequired

Async · Raises CuaError

SpacesdClient.press#

Presses one key (enter, KEY_ESCAPE, a, ...).

async def press(self, key: str) -> None
ParameterTypeDefault
keyStringrequired

Async · Raises CuaError

SpacesdClient.hotkey#

Presses a chord (["ctrl", "c"]).

async def hotkey(self, keys: List[str]) -> None
ParameterTypeDefault
keysVec<String>required

Async · Raises CuaError

SpacesdClient.pointer_json#

Full ComputerService.Pointer from proto3 JSON.

async def pointer_json(self, request_json: str) -> str
ParameterTypeDefault
request_jsonStringrequired

Returns String · Async · Raises CuaError

SpacesdClient.keyboard_json#

Full ComputerService.Keyboard from proto3 JSON.

async def keyboard_json(self, request_json: str) -> str
ParameterTypeDefault
request_jsonStringrequired

Returns String · Async · Raises CuaError

SpacesdClient.get_clipboard#

Clipboard text.

async def get_clipboard(self) -> Optional[str]

Returns Option<String> · Async · Raises CuaError

SpacesdClient.set_clipboard#

Sets clipboard text; returns the clipboard generation.

async def set_clipboard(self, text: str) -> int
ParameterTypeDefault
textStringrequired

Returns u64 · Async · Raises CuaError

SpacesdClient.cursor_position#

Pointer position.

async def cursor_position(self) -> Point

Returns Point · Async · Raises CuaError

SpacesdClient.displays#

Displays as proto3 JSON ([Display]).

async def displays(self) -> str

Returns String · Async · Raises CuaError

Screenshot record#

A captured screenshot.

Returned by Sandbox.guest_screenshot, Space.screenshot, SpacesdClient.screenshot.

FieldTypeDefaultDescription
imageVec<u8>Encoded image.
formatImageFormatEncoding.
widthu32Pixel width.
heightu32Pixel height.
scalef64Image pixels per logical point.
screenshot_id / screenshotIdStringId for screenshot-space input.

ScreenshotOptions record#

Screenshot options.

FieldTypeDefaultDescription
displayOption<String>NoneDisplay id (primary when unset).
formatOption<ImageFormat>NoneEncoding (PNG when unset).
qualityOption<u32>NoneLossy quality 1–100.
max_dimension / maxDimensionOption<u32>NoneLong-edge cap in pixels.
include_cursor / includeCursorboolfalseDraw the cursor.

ImageFormat enum#

Screenshot encoding.

ImageFormat.PNG
ImageFormat.JPEG
ImageFormat.WEBP
VariantDescription
PngPNG.
JpegJPEG.
WebpWebP.

Point record#

A point.

Returned by SpacesdClient.cursor_position.

FieldTypeDefaultDescription
xf64X.
yf64Y.

Media#

Media sessions deliver encoded frames and audio packets (FrameSink, AudioSink) to callbacks you implement.

Open a session#

Methods of SpacesdClient.

SpacesdClient.open_media#

Opens a media session and starts delivering encoded video frames and control events to frames. Decoding stays in the host language.

async def open_media(self, options: MediaOpenOptions, frames: FrameSink) -> MediaSession
ParameterTypeDefault
optionsMediaOpenOptionsrequired
framesFrameSinkrequired

Returns MediaSession · Async · Raises CuaError

SpacesdClient.open_media_with_audio#

SpacesdClient.open_media that also delivers audio packets to audio (set options.audio to negotiate audio tracks).

Two methods instead of an optional sink: optional callback objects do not lower in every binding generator.

async def open_media_with_audio(self, options: MediaOpenOptions, frames: FrameSink, audio: AudioSink) -> MediaSession
ParameterTypeDefault
optionsMediaOpenOptionsrequired
framesFrameSinkrequired
audioAudioSinkrequired

Returns MediaSession · Async · Raises CuaError

Media bridge#

Methods of Sandbox.

Sandbox.open_media_bridge#

Opens a media session and returns a loopback WebSocket bridge for a webview (daemon mode). open_media_json is a cua.env.v1.OpenMediaRequest in proto3 JSON (None: primary display).

async def open_media_bridge(self, open_media_json: Optional[str]) -> MediaBridge
ParameterTypeDefault
open_media_jsonOption<String>required

Returns MediaBridge · Async · Raises CuaError

MediaSession#

A live media session.

Returned by Space.attach_stream, SpacesdClient.open_media, SpacesdClient.open_media_with_audio.

MethodDescription
closeCloses the socket and the session.
request_keyframeStreamService.RequestKeyframe.
send_controlSends a JSON control message on the media socket (for example {"type":"request_keyframe","payload":{}} or interactive input).
set_preferences_jsonStreamService.SetPreferences from proto3 JSON (the session id is filled in).
AccessorReturnsDescription
codec()StringNegotiated video codec (h264, bgra, png).
is_closed()boolWhether the socket has closed.
open_response_json()StringOpenMediaResponse as proto3 JSON (ticket removed).
session_id()StringOpenMediaResponse.media_session_id.
stats()MediaStatsDelivery counters.

MediaSession.close#

Closes the socket and the session.

async def close(self) -> None

Async · Raises CuaError

MediaSession.request_keyframe#

StreamService.RequestKeyframe.

async def request_keyframe(self) -> None

Async · Raises CuaError

MediaSession.send_control#

Sends a JSON control message on the media socket (for example {"type":"request_keyframe","payload":{}} or interactive input).

def send_control(self, json: str) -> None
ParameterTypeDefault
jsonStringrequired

Raises CuaError

MediaSession.set_preferences_json#

StreamService.SetPreferences from proto3 JSON (the session id is filled in).

async def set_preferences_json(self, json: str) -> None
ParameterTypeDefault
jsonStringrequired

Async · Raises CuaError

MediaOpenOptions record#

Media session options.

FieldTypeDefaultDescription
displayOption<String>NoneDisplay id (primary when unset). Ignored when window_handle is set.
window_handle / windowHandleOption<String>NoneWindow handle (from ListTargets / ListWindows).
max_fps / maxFpsu320FPS cap (0 = driver default).
max_dimension / maxDimensionu320Long-edge cap (0 = native).
audioboolfalseAlso negotiate desktop/app audio (Opus).
disable_video / disableVideoboolfalseAudio only.
request_json / requestJsonOption<String>NoneExtra OpenMediaRequest fields as proto3 JSON, merged over the above (escape hatch).

MediaBridge record#

A media bridge for webviews (daemon mode).

Returned by Sandbox.open_media_bridge.

FieldTypeDefaultDescription
ws_url / wsUrlStringLoopback ws:// URL carrying a short-lived bridge ticket. Speaks rcdp wire v2 unchanged; no env token is exposed.
ticketStringThe bridge ticket (also accepted as subprotocol cua.ticket.<ticket>).
open_media_response_json / openMediaResponseJsonStringcua.env.v1.OpenMediaResponse as proto3 JSON (upstream ticket removed).

AudioSink#

Receives audio packets. Must return quickly.

You implement AudioSink and pass it to the SDK (a callback interface): subclass it in Python, implement the interface in TypeScript, the AudioSink protocol in Swift, the interface in Kotlin and the trait in Rust.

MethodDescription
on_audioAn audio packet.

AudioSink.on_audio#

An audio packet.

def on_audio(self, packet: AudioPacket) -> None
ParameterTypeDefault
packetAudioPacketrequired

FrameSink#

Receives video frames and control events. Implementations must return quickly and hand off decoding.

You implement FrameSink and pass it to the SDK (a callback interface): subclass it in Python, implement the interface in TypeScript, the FrameSink protocol in Swift, the interface in Kotlin and the trait in Rust.

MethodDescription
on_eventA control message or the socket close.
on_frameA video access unit.

FrameSink.on_event#

A control message or the socket close.

def on_event(self, event: MediaEvent) -> None
ParameterTypeDefault
eventMediaEventrequired

FrameSink.on_frame#

A video access unit.

def on_frame(self, frame: VideoFrame) -> None
ParameterTypeDefault
frameVideoFramerequired

AudioPacket record#

One audio packet (MEDIA.md §12.2).

FieldTypeDefaultDescription
track_id / trackIdu16Track id from NegotiatedAudio.
sequenceu32Per-track sequence (wraps mod 2³²).
pts_us / ptsUsu64Media-clock time of the first sample (µs).
frame_samples / frameSamplesu16Samples per channel.
config_epoch / configEpochu8Must match the latest audio_config of the track.
discontinuityboolThe previous packet was dropped or the track restarted.
dtxboolDTX / comfort-noise frame.
dataVec<u8>One Opus packet or interleaved s16le PCM.

MediaEvent record#

A control message (hello, session_opened, lifecycle, audio_config, stats, error, ...) or the close of the socket (kind = "closed", json = {"code":…, "reason":…}).

FieldTypeDefaultDescription
kindStringThe message type.
jsonStringThe whole message as JSON.

MediaStats record#

Delivery counters.

Returned by MediaSession.stats.

FieldTypeDefaultDescription
framesu64Video frames delivered.
frames_dropped / framesDroppedu64Video frames dropped because the sink fell behind.
audio_packets / audioPacketsu64Audio packets delivered.
malformedu64Malformed binary messages ignored.
eventsu64Control events delivered.

VideoFrame record#

One encoded video access unit.

FieldTypeDefaultDescription
sequenceu64Per-target frame sequence (may start anywhere; gaps mean replaced frames).
codecStringh264, bgra or png.
keyframeboolRandom-access point (IDR with SPS/PPS for H.264).
widthu32Payload width in pixels.
heightu32Payload height in pixels.
capture_timestamp_us / captureTimestampUsu64Media-clock capture time (µs).
codec_epoch / codecEpochu64Decoder configuration generation; reset the decoder when it changes.
geometry_epoch / geometryEpochu64Coordinate generation.
dataVec<u8>Encoded payload.
header_json / headerJsonStringThe packet's JSON header, verbatim.