Skip to content

Verify your setup

Run these checks in order. Each one narrows the source of a failure.

Terminal window
curl -fsS http://localhost:8090/health

Expected:

{
"status": "ok",
"service": "tomo-streaming-control-plane"
}
Terminal window
curl -fsS http://localhost:8090/api/v1/stream-servers

The streamServers array should include:

  • camera-stream-server
  • desktop-stream-server

Discovery is public and does not require the API key.

Terminal window
export TOMO_STREAM_API_KEY="the-same-value-used-in-your-env-file"
curl -fsS http://localhost:8090/api/v1/streams \
-H "x-api-key: $TOMO_STREAM_API_KEY"

Expected on a new installation:

{ "sessions": [] }

An invalid_api_key response means the shell value does not match the control-plane environment.

Confirm the device first:

Terminal window
ls -l /dev/video0

Then create the session:

Terminal window
curl -fsS -X POST http://localhost:8090/api/v1/streams \
-H "content-type: application/json" \
-H "x-api-key: $TOMO_STREAM_API_KEY" \
-d '{
"type": "camera-stream-server",
"name": "Verification camera",
"config": {
"videoDevice": "/dev/video0",
"width": 1280,
"height": 720,
"fps": 30,
"captureAudio": false
}
}'

Save the returned session.id. A healthy response includes:

{
"session": {
"id": "",
"type": "camera-stream-server",
"status": "running",
"runtime": {
"connectedCount": 0,
"activity": "empty"
},
"connection": {
"signalingPath": "/signaling",
"room": "",
"accessToken": ""
}
}
}

empty is not an error. It means the runtime is ready but no player has joined.

Terminal window
docker ps \
--filter label=tomo.runtime=stream-server \
--format 'table {{.ID}}\t{{.Image}}\t{{.Status}}\t{{.Names}}'

One stream-server container should be present for the live session.

Terminal window
export TOMO_SESSION_ID="replace-with-session-id"
curl -fsS -X DELETE \
"http://localhost:8090/api/v1/streams/$TOMO_SESSION_ID" \
-H "x-api-key: $TOMO_STREAM_API_KEY"

Success returns HTTP 204 and removes the runtime container.

Use the TypeScript SDK to create sessions from your backend and join signaling from an authorized browser or native client.