import os
import asyncio
from meshagent.api import (
RoomClient,
WebSocketClientProtocol,
ParticipantToken,
ApiScope,
ParticipantGrant,
)
from meshagent.api.helpers import meshagent_base_url, websocket_room_url
def env(name: str) -> str:
val = os.getenv(name)
if not isinstance(val, str) or not val:
raise RuntimeError(f"Missing required environment variable: {name}.")
return val
async def main():
# Define a unique room name
room_name = "my-room"
async with RoomClient(
protocol=WebSocketClientProtocol(
url=websocket_room_url(room_name=room_name, base_url=meshagent_base_url()),
token=ParticipantToken(
name="participant",
project_id=env("MESHAGENT_PROJECT_ID"),
api_key_id=env("MESHAGENT_KEY_ID"),
grants=[
ParticipantGrant(name="room", scope=room_name),
ParticipantGrant(name="role", scope="agent"),
ParticipantGrant(name="api", scope=ApiScope.agent_default()),
],
).to_jwt(token=env("MESHAGENT_SECRET")),
)
) as room:
print(f"Connected to room: {room.room_name}")
# open our document
document = await room.sync.open(path="hello-world.document")
# wait for the document to sync from the server
await document.synchronized
# our root element is automatically added to the document, let's construct the sample document by inserting
# a body with a paragraph element
document.root.append_child(tag_name="body", attributes={"text": "hello world!"})
# wait before closing so the sync can finish
await asyncio.sleep(3)
asyncio.run(main())