vuer.server
workspace_handler
Handle workspace file requests.
First checks for dynamic links, then resolves files through the workspace.
:param request: The aiohttp request object. :param workspace: The Workspace instance to resolve files from. :return: aiohttp Response object.
At
Proxy Object for using the @ notation. Also supports being called direction, which supports more complex arguments.
At.init
SceneOps
Base class providing scene graph operations (set, update, add, upsert, remove).
Subclasses must implement matmul to handle event dispatch. Used by both VuerSession and SceneStore.
SceneOps.set
Set the scene. Usage: obj.set @ Scene(...)
SceneOps.update
Update existing elements. Usage: obj.update @ element or obj.update @ [elem1, elem2]
SceneOps.add
Add elements. Usage: obj.add @ elem or obj.add(to="parent") @ elem
SceneOps.upsert
Upsert elements. Usage: obj.upsert @ elem or obj.upsert(to="parent") @ elem
SceneOps.remove
Remove elements by key. Usage: obj.remove @ "key" or obj.remove @ ["k1", "k2"]
BoundFn
Generic wrapper for decorators that bind functions and enable .start() method.
This class wraps a function and optionally starts the Vuer server. It provides a .start() method that can be called to start the server later.
Example::
@app.spawn() async def main(session): ...
Later, start the server
main.start()
BoundFn.init
:param inst: Vuer instance :param attr_name: Name of the attribute to set on the Vuer instance :param start: Whether to start the server immediately
BoundFn.start
Start the Vuer server with optional keyword arguments.
VuerSession
VuerSession.init
VuerSession.socket
Getter for the websocket object.
this is useful for closing the socket session from the client side.
Example Usage::
@app.spawn(start=True): async def main(session: VuerSession): print("doing something...") await sleep(1.0)
print("I am done! closing the socket.") session.socket.close()
VuerSession.grab_render
Grab a render from the client.
:param quality: The quality of the render. 0.0 - 1.0 :param subsample: The subsample of the render. :param ttl: The time to live for the handler. If the handler is not called within the time it gets removed from the handler list.
VuerSession.get_webxr_mesh
Request WebXR mesh data from the client.
This method sends a GET_WEBXR_MESH RPC request to the client and waits for a response containing the detected environmental meshes from the WebXR AR session.
The response contains mesh data including vertices, indices, semantic labels, and transformation matrices for each detected mesh.
Usage Example::
from vuer import Vuer, VuerSession from vuer.schemas import WebXRMesh, Scene from asyncio import sleep
app = Vuer()
@app.spawn(start=True) async def main(session: VuerSession): session.set @ Scene( children=[WebXRMesh(key="webxr-mesh", stream=False)] )
await sleep(2) # Wait for meshes to be detected
Request mesh data on-demand
mesh_data = await session.get_webxr_mesh(key="webxr-mesh")
meshes = mesh_data.value.get('meshes', []) print(f"Retrieved {len(meshes)} meshes")
for mesh in meshes: vertices = mesh['vertices'] indices = mesh['indices'] semantic_label = mesh.get('semanticLabel', 'unknown') matrix = mesh['matrix']
print(f"Mesh: {len(vertices)/3:.0f} vertices, label={semantic_label}")
:param key: The key of the WebXRMesh component to query (default: "webxr-mesh") :param ttl: The time to live for the handler in seconds. If no response is received within this time, a TimeoutError is raised (default: 2.0) :return: ClientEvent containing mesh data in event.value['meshes'] :raises asyncio.TimeoutError: If the client doesn't respond within ttl seconds :raises AssertionError: If websocket session is missing
VuerSession.send
Sending the event through the uplink queue.
VuerSession.rpc
Send a ServerRPC event to the client and wait for a response through the session queue
:param event: The ServerRPC event to send. :param ttl: The time to live for the handler. If the handler is not called within the time it gets removed from the handler list. :return: ClientEvent
VuerSession.popleft
VuerSession.pop
VuerSession.clear
clears all client messages
VuerSession.stream
VuerSession.spawn_task
Spawn a task in the running asyncio event loop
Useful for background tasks. Returns an asyncio task that can be canceled.
.. code-block:: python :linenos:
async background_task(): print('\rthis ran once')
async long_running_bg_task(): while True: await asyncio.sleep(1.0) print("\rlong running background task is still running")
@app.spawn_task async def main_fn(sess: VuerSession):
Prepare background tasks here:
task = sess.spawn_task(background_task) long_running_task = sess.spawn_task(long_running_bg_task)
Now to cancel a running task, simply
.. code-block:: python :linenos:
task.cancel()
Todos
▫️ Add a way to automatically clean up when exiting the main_fn.
VuerSession.till
Wait for and return an event of the specified type.
This method registers a one-time handler for the specified event type and awaits its arrival. Useful for waiting on specific events like INIT.
Example Usage::
@app.spawn(start=True) async def main(session: VuerSession):
Wait for the INIT event from the client
e = await session.till("INIT") client_type = e.value.get('clientType') # 'python' or browser info
if client_type == 'python': print("Python client connected!") else: print(f"Browser connected: {e.value.get('userAgent')}")
:param event: The event type to wait for (e.g., "INIT", "CAMERA_MOVE") :param timeout: Optional timeout in seconds. Raises asyncio.TimeoutError if exceeded. :return: The ClientEvent of the specified type :raises asyncio.TimeoutError: If timeout is specified and exceeded
VuerSession.forever
Keep the session alive indefinitely.
This is useful when you want to set up a scene and keep the server running without the session closing. The session will remain active until the client disconnects or the server is stopped.
Example Usage::
@app.spawn(start=True) async def main(session: VuerSession): session.set @ Scene(Box(args=[0.2, 0.2, 0.2], key="box")) await session.forever()
Inherited members
set— fromvuer.server.SceneOpsupdate— fromvuer.server.SceneOpsadd— fromvuer.server.SceneOpsupsert— fromvuer.server.SceneOpsremove— fromvuer.server.SceneOps
Vuer
Vuer Server
This is the server for the Vuer client.
Usage::
app = Vuer()
@app.spawn async def main(session: VuerSession): session.set @ Scene(children=[...])
app.run()
.. automethod:: bind .. automethod:: spawn .. automethod:: relay .. automethod:: bound_fn .. automethod:: spawn_task .. automethod:: get_url .. automethod:: send .. automethod:: rpc .. automethod:: rpc_stream .. automethod:: close_ws .. automethod:: uplink .. automethod:: downlink .. automethod:: add_handler .. automethod:: _ttl_handler .. automethod:: run
Vuer.ssl
Returns "s" if SSL is enabled, "" otherwise.
Use in URL construction: f"http{self.ssl}://" or f"ws{self.ssl}://"
Vuer.local_ip
Get the local LAN IP address.
This is a well-known and safe approach for determining your local IP. It uses a UDP socket connection to determine the local IP address that would be used to reach external networks. No data is actually sent to the remote address.
:return: The local IP address as a string, or "127.0.0.1" if unavailable.
Vuer.create_webrtc_stream
Create a WebRTC stream hosted on this Vuer server.
Must be called before app.start(). Routes are registered during startup.
Args: stream_id: Unique identifier for the stream (used in URL path). track: Optional custom MediaStreamTrack. If None, creates an internal track and enables push_frame(). codec: Preferred codec ("H264" or "VP8"). Default "H264". max_bitrate: Maximum bitrate in bps (e.g. 2_000_000 for 2 Mbps). max_framerate: Maximum frames per second (e.g. 15, 30). resolution: Tuple of (width, height) for fallback frame. Default (640, 480).
Returns: WebRTCStream instance with .push_frame() and .endpoint properties.
Vuer.relay
This is the relay object for sending events to the server.
Todo: add API for specifying the websocket ID. Or just broadcast to all. Todo: add type hint
Interface: <uri>/relay?sid=<websocket_id>
:return:
- Status 200
- Status 400
Vuer.workspace_prefix
URL prefix for workspace files, accessible over the network.
Uses local_ip and respects SSL settings for network access (e.g., VR devices).
Vuer.localhost_prefix
URL prefix for workspace files, localhost only.
Use this for local development when network access is not needed.
Vuer.format_urls
Generate all relevant URLs for display based on connection context.
Returns a list of tuples (label, url) for different connection modes. Intelligently handles:
- Local development (localhost)
- LAN connections
- Remote vuer.ai connections
- Port display (hides default ports)
- WebSocket parameter inclusion (when needed)
:return: List of (label, url) tuples
Vuer.bound_fn
This is the default generator function in the socket connection handler
Vuer.spawn
Register a spawn handler with optional client filtering.
Handlers are matched against the client's INIT event. Only the first matching handler runs; a warning is shown if multiple handlers match.
Filter syntax supports fnmatch wildcards:
client="python"- exact matchplatform="*"- wildcard match
Example::
@app.spawn(client="python") async def python_handler(session: VuerSession):
Only for Python clients
...
@app.spawn(client="browser") async def browser_handler(session: VuerSession):
Only for browser clients
...
@app.spawn # No filter = matches all clients async def default_handler(session: VuerSession): ...
:param fn: The function to spawn. :param start: Start server after binding :param filters: Filter criteria to match against INIT event value (e.g., client="python", platform="Darwin") :return: BoundFn instance that can be called later with .start()
Vuer.bind
Bind an asynchronous generator function for use in socket connection handler. The function should be a generator that yields Page objects.
:param fn: The function to bind. :param start: Start server after binding :return: BoundFn instance that can be called later with .start()
Vuer.get_url
Get the URL for the Vuer client.
:param host: The host to use in the websocket URL (e.g., "localhost" or IP address). :return: The URL for the Vuer client.
Vuer.send
Vuer.rpc
RPC only takes a single response. For multi-response streaming, we need to build a new one
Question is whether we want to make this RPC an awaitable funciton.
:param ttl: The time to live for the handler. If the handler is not called within the time it gets removed from the handler list.
Vuer.rpc_stream
This RPC offers multiple responses.
Vuer.close_ws
Vuer.uplink
Vuer.downlink
The websocket handler for receiving messages from the client.
:param ws: The websocket. :param request: The request (unused). :return: None
Vuer.add_handler
Adding event handlers to the vuer server.
:param event_type: The event type to handle.
:param fn: The function to handle the event.
:param once: Whether to remove the handler after the first call.
This is useful for RPC, which cleans up after itself.
The issue is for RPC, the key also needs to match. So we hack it here to use
a call specific event_type to enforce the cleanup.
Usage:
As a decorator::
app = Vuer() @app.add_handler("CAMERA_MOVE") def on_camera(event: ClientEvent, session: VuerSession): print("camera event", event.etype, event.value)
As a function::
app = Vuer() def on_camera(event: ClientEvent, session: VuerSession): print("camera event", event.etype, event.value)
app.add_handler("CAMERA_MOVE", on_camera) app.run()
Vuer.socket_index
This is the relay object for sending events to the server.
Todo: add API for specifying the websocket ID. Or just broadcast to all. Todo: add type hint
Interface: <uri>/relay?sid=<websocket_id>
:return:
- Status 200
- Status 400
Vuer.add_route
Vuer.run
Run the server.
.. deprecated::
Use :meth:start instead. This method will be removed in a future version.
Vuer.start
Vuer.loop_forever
Deprecated: Use await session.forever() instead.
.. deprecated:: 0.1.2
This method will be removed in a future version.
Use await session.forever() for cleaner session-scoped waiting.
Inherited members
host— fromvuer.base.Servercert— fromvuer.base.Serverkey— fromvuer.base.Serverca_cert— fromvuer.base.ServerWEBSOCKET_MAX_SIZE— fromvuer.base.ServerREQUEST_MAX_SIZE— fromvuer.base.Server
Public imports
These symbols are available from this module. Their definitions are documented in the linked modules.
Server—vuer.base.Serverhandle_file_request—vuer.base.handle_file_requestwebsocket_handler—vuer.base.websocket_handlerAdd—vuer.events.AddClientEvent—vuer.events.ClientEventFrame—vuer.events.FrameGrabRender—vuer.events.GrabRenderNullEvent—vuer.events.NullEventRemove—vuer.events.RemoveServerEvent—vuer.events.ServerEventServerRPC—vuer.events.ServerRPCSet—vuer.events.SetUpdate—vuer.events.UpdateUpsert—vuer.events.UpsertPage—vuer.schemas.html_components.PageUrl—vuer.types.UrlBlob—vuer.workspace.workspace.BlobWorkspace—vuer.workspace.workspace.Workspaceguess_content_type—vuer.workspace.workspace.guess_content_typeworkspace_from_config—vuer.workspace.workspace.workspace_from_config