Spaces:
Sleeping
Sleeping
# Client Library API Comparison | |
This table shows the correspondence between the Python and JavaScript/TypeScript client libraries for RobotHub TransportServer. | |
## π¦ Installation | |
| Python | JavaScript/TypeScript | | |
|--------|----------------------| | |
| `uv add transport-server-client` | `bun add @robothub/transport-server-client` | | |
## π§ Imports | |
| Python | JavaScript/TypeScript | | |
|--------|----------------------| | |
| `from transport_server_client import RoboticsProducer` | `import { robotics } from '@robothub/transport-server-client'` | | |
| `from transport_server_client import RoboticsConsumer` | `const producer = new robotics.RoboticsProducer()` | | |
| `from transport_server_client.video import VideoProducer` | `import { video } from '@robothub/transport-server-client'` | | |
| `from transport_server_client.video import VideoConsumer` | `const producer = new video.VideoProducer()` | | |
## π€ Robotics Producer | |
| Operation | Python | JavaScript/TypeScript | | |
|-----------|--------|----------------------| | |
| **Create instance** | `producer = RoboticsProducer('http://localhost:8000')` | `const producer = new robotics.RoboticsProducer('http://localhost:8000')` | | |
| **Connect to room** | `await producer.connect(workspace_id, room_id)` | `await producer.connect(workspaceId, roomId)` | | |
| **Create room** | `room_info = await producer.create_room()` | `const { workspaceId, roomId } = await producer.createRoom()` | | |
| **Send joint update** | `await producer.send_joint_update(joints)` | `await producer.sendJointUpdate(joints)` | | |
| **Send state sync** | `await producer.send_state_sync(state)` | `await producer.sendStateSync(state)` | | |
| **Emergency stop** | `await producer.send_emergency_stop(reason)` | `await producer.sendEmergencyStop(reason)` | | |
| **List rooms** | `rooms = await producer.list_rooms(workspace_id)` | `const rooms = await producer.listRooms(workspaceId)` | | |
| **Delete room** | `await producer.delete_room(workspace_id, room_id)` | `await producer.deleteRoom(workspaceId, roomId)` | | |
| **Disconnect** | `await producer.disconnect()` | `await producer.disconnect()` | | |
## π€ Robotics Consumer | |
| Operation | Python | JavaScript/TypeScript | | |
|-----------|--------|----------------------| | |
| **Create instance** | `consumer = RoboticsConsumer('http://localhost:8000')` | `const consumer = new robotics.RoboticsConsumer('http://localhost:8000')` | | |
| **Connect to room** | `await consumer.connect(workspace_id, room_id)` | `await consumer.connect(workspaceId, roomId)` | | |
| **Get current state** | `state = await consumer.get_state_sync()` | `const state = await consumer.getStateSyncAsync()` | | |
| **Joint update callback** | `consumer.on_joint_update(callback)` | `consumer.onJointUpdate(callback)` | | |
| **State sync callback** | `consumer.on_state_sync(callback)` | `consumer.onStateSync(callback)` | | |
| **Error callback** | `consumer.on_error(callback)` | `consumer.onError(callback)` | | |
| **Connected callback** | `consumer.on_connected(callback)` | `consumer.onConnected(callback)` | | |
| **Disconnected callback** | `consumer.on_disconnected(callback)` | `consumer.onDisconnected(callback)` | | |
| **Disconnect** | `await consumer.disconnect()` | `await consumer.disconnect()` | | |
## πΉ Video Producer | |
| Operation | Python | JavaScript/TypeScript | | |
|-----------|--------|----------------------| | |
| **Create instance** | `producer = VideoProducer('http://localhost:8000')` | `const producer = new video.VideoProducer('http://localhost:8000')` | | |
| **Connect to room** | `await producer.connect(workspace_id, room_id)` | `await producer.connect(workspaceId, roomId)` | | |
| **Start camera** | `await producer.start_camera(config)` | `await producer.startCamera(constraints)` | | |
| **Start screen share** | `await producer.start_screen_share()` | `await producer.startScreenShare()` | | |
| **Stop streaming** | `await producer.stop_streaming()` | `await producer.stopStreaming()` | | |
| **Update config** | `await producer.update_video_config(config)` | `await producer.updateVideoConfig(config)` | | |
| **Disconnect** | `await producer.disconnect()` | `await producer.disconnect()` | | |
## πΉ Video Consumer | |
| Operation | Python | JavaScript/TypeScript | | |
|-----------|--------|----------------------| | |
| **Create instance** | `consumer = VideoConsumer('http://localhost:8000')` | `const consumer = new video.VideoConsumer('http://localhost:8000')` | | |
| **Connect to room** | `await consumer.connect(workspace_id, room_id)` | `await consumer.connect(workspaceId, roomId)` | | |
| **Start receiving** | `await consumer.start_receiving()` | `await consumer.startReceiving()` | | |
| **Stop receiving** | `await consumer.stop_receiving()` | `await consumer.stopReceiving()` | | |
| **Attach to video element** | N/A (Python) | `consumer.attachToVideoElement(videoElement)` | | |
| **Frame callback** | `consumer.on_frame_update(callback)` | `consumer.onFrameUpdate(callback)` | | |
| **Stream started callback** | `consumer.on_stream_started(callback)` | `consumer.onStreamStarted(callback)` | | |
| **Stream stopped callback** | `consumer.on_stream_stopped(callback)` | `consumer.onStreamStopped(callback)` | | |
| **Disconnect** | `await consumer.disconnect()` | `await consumer.disconnect()` | | |
## β‘ Factory Functions | |
| Operation | Python | JavaScript/TypeScript | | |
|-----------|--------|----------------------| | |
| **Quick producer** | `producer = await create_producer_client(url)` | `const producer = await robotics.createProducerClient(url)` | | |
| **Quick consumer** | `consumer = await create_consumer_client(room_id, url)` | `const consumer = await robotics.createConsumerClient(workspaceId, roomId, url)` | | |
## π§ Context Managers / Lifecycle | |
| Operation | Python | JavaScript/TypeScript | | |
|-----------|--------|----------------------| | |
| **Auto cleanup** | `async with RoboticsProducer(url) as producer:` | No built-in equivalent | | |
| **Check connection** | `producer.is_connected()` | `producer.isConnected()` | | |
| **Connection info** | `info = producer.get_connection_info()` | `const info = producer.getConnectionInfo()` | | |
## π Data Formats | |
### Joint Data | |
| Python | JavaScript/TypeScript | | |
|--------|----------------------| | |
| `{'name': 'shoulder', 'value': 45.0}` | `{ name: 'shoulder', value: 45.0 }` | | |
| `[{'name': 'shoulder', 'value': 45.0}]` | `[{ name: 'shoulder', value: 45.0 }]` | | |
### State Data | |
| Python | JavaScript/TypeScript | | |
|--------|----------------------| | |
| `{'shoulder': 45.0, 'elbow': -30.0}` | `{ shoulder: 45.0, elbow: -30.0 }` | | |
### Room Info Response | |
| Python | JavaScript/TypeScript | | |
|--------|----------------------| | |
| `{'workspace_id': 'uuid', 'room_id': 'uuid'}` | `{ workspaceId: 'uuid', roomId: 'uuid' }` | | |
## π Naming Conventions | |
| Python (snake_case) | JavaScript/TypeScript (camelCase) | | |
|---------------------|-----------------------------------| | |
| `send_joint_update` | `sendJointUpdate` | | |
| `send_state_sync` | `sendStateSync` | | |
| `get_state_sync` | `getStateSyncAsync` | | |
| `on_joint_update` | `onJointUpdate` | | |
| `create_room` | `createRoom` | | |
| `list_rooms` | `listRooms` | | |
| `workspace_id` | `workspaceId` | | |
| `room_id` | `roomId` | | |
| `start_camera` | `startCamera` | | |
| `stop_streaming` | `stopStreaming` | | |
--- | |
**Both libraries provide the same functionality with language-appropriate conventions!** π€β¨ |