Using bindings into LibWebRTC from Chromium, this Rust-based load test server interacts with a JavaScript SDK and creates peer connections on a given SFU.
- Configuration
- Running
- Dependent Services
- Running the Server
- Building the Docker Image
- Running Docker
- Protocol Buffers
- API
First, copy the example config:
cp .env.example .env
Update .env
with the appropriate values.
To run containers of dependent services:
docker compose up
To pull up the Grafana dashboard, navigate your browser to http://localhost:9091
. The default username and password is admin
.
To view the video dashboard, navigate your browser to http://localhost:9091/d/R48Exadnz/video-dashboard?orgId=1
.
RUST_LOG=INFO cargo run
docker build . -t "arcas/load-test-server"
docker run -p 50051:50051 "arcas/load-test-server"
The protocol buffers are located in the /proto
directory.
The examples below use grpccurl and assumes they're run from the repo base.
Create a new session on the server.
Request Protocol Buffers
enum LogLevel {
NONE = 0;
INFO = 1;
WARN = 2;
ERROR = 3;
VERBOSE = 4;
}
message CreateSessionRequest {
string session_id = 1;
string name = 2;
uint64 polling_state_s = 3;
LogLevel log_level = 4;
}
Response Protocol Buffers
message CreateSessionResponse { string session_id = 1; }
grpcurl -plaintext -import-path ./proto -proto webrtc.proto -d '{"name": "First Session"}' [::]:50051 webrtc.WebRtc/CreateSession
Once a session is created, it can be started.
Request Protocol Buffers
message StartSessionRequest { string session_id = 1; }
Response Protocol Buffers
message StopSessionRequest { string session_id = 1; }
After creating a session:
grpcurl -plaintext -import-path ./proto -proto webrtc.proto -d '{"sessionId": "9s-KsEPQkO_IgfINBV4x6"}' [::]:50051 webrtc.WebRtc/StartSession
Stop a session and clean up resources.
Request Protocol Buffers
message StopSessionRequest { string session_id = 1; }\
After creating and starting a session:
grpcurl -plaintext -import-path ./proto -proto webrtc.proto -d '{"sessionId": "9s-KsEPQkO_IgfINBV4x6"}' [::]:50051 webrtc.WebRtc/StopSession
Stats are collected per session.
Request Protocol Buffers
message GetStatsRequest { string session_id = 1; }
Response Protocol Buffers
message GetStatsRequest { string session_id = 1; }
message PeerConnectionState {
int32 num_sending = 1;
int32 num_not_sending = 2;
int32 num_receiving = 3;
int32 num_not_receiving = 4;
}
message SessionStats {
string id = 1;
string name = 2;
uint64 num_peer_connections = 3;
string state = 4;
PeerConnectionState peer_connection_state = 5;
google.protobuf.Timestamp start_time = 6;
google.protobuf.Timestamp stop_time = 7;
uint64 elapsed_time = 8;
}
message GetStatsResponse {
SessionStats session = 1;
}
To retrieve stats for an active session:
grpcurl -plaintext -import-path ./proto -proto webrtc.proto -d '{"sessionId": "9s-KsEPQkO_IgfINBV4x6"}' [::]:50051 webrtc.WebRtc/GetStats
Create a new peer connection for an active session.
Request Protocol Buffers
message CreatePeerConnectionRequest {
string session_id = 1;
string peer_connection_id = 2;
string name = 3;
}
To create a new peer connection on an active session:
grpcurl -plaintext -import-path ./proto -proto webrtc.proto -d '{"sessionId": "9s-KsEPQkO_IgfINBV4x6", "peerConnectionId": "py7cllxbm--cyw93x7k4p", "name": "First Peer Connection"}' [::]:50051 webrtc.WebRtc/CreatePeerConnection
Request Protocol Buffers
message CreateSDPRequest {
string session_id = 1;
string peer_connection_id = 2;
}
Response Protocol Buffers
enum SDPType {
OFFER = 0;
PRANSWER = 1;
ANSWER = 2;
ROLLBACK = 3;
}
message CreateSDPResponse {
string session_id = 1;
string peer_connection_id = 2;
string sdp = 3;
SDPType sdp_type = 4;
}
To create an offer for a peer connection of an active session:
grpcurl -plaintext -import-path ./proto -proto webrtc.proto -d '{"sessionId": "9s-KsEPQkO_IgfINBV4x6", "peerConnectionId": "py7cllxbm--cyw93x7k4p"}' [::]:50051 webrtc.WebRtc/CreateOffer
Request Protocol Buffers
message CreateSDPRequest {
string session_id = 1;
string peer_connection_id = 2;
}
Response Protocol Buffers
enum SDPType {
OFFER = 0;
PRANSWER = 1;
ANSWER = 2;
ROLLBACK = 3;
}
message CreateSDPResponse {
string session_id = 1;
string peer_connection_id = 2;
string sdp = 3;
SDPType sdp_type = 4;
}
To create an answer for a peer connection of an active session:
grpcurl -plaintext -import-path ./proto -proto webrtc.proto -d '{"sessionId": "9s-KsEPQkO_IgfINBV4x6", "peerConnectionId": "py7cllxbm--cyw93x7k4p"}' [::]:50051 webrtc.WebRtc/CreateAnswer
Request Protocol Buffers
enum SDPType {
OFFER = 0;
PRANSWER = 1;
ANSWER = 2;
ROLLBACK = 3;
}
message SetSDPRequest {
string session_id = 1;
string peer_connection_id = 2;
string sdp = 3;
SDPType sdp_type = 4;
}
Response Protocol Buffers
message SetSDPResponse {
string session_id = 1;
string peer_connection_id = 2;
bool success = 3;
}
To set the local description for a peer connection of an active session:
grpcurl -plaintext -import-path ./proto -proto webrtc.proto -d '{"sessionId": "9s-KsEPQkO_IgfINBV4x6", "peerConnectionId": "py7cllxbm--cyw93x7k4p", "sdp": "", "sdp_type": "OFFER"}' [::]:50051 webrtc.WebRtc/SetLocalDescription
Request Protocol Buffers
enum SDPType {
OFFER = 0;
PRANSWER = 1;
ANSWER = 2;
ROLLBACK = 3;
}
message SetSDPRequest {
string session_id = 1;
string peer_connection_id = 2;
string sdp = 3;
SDPType sdp_type = 4;
}
Response Protocol Buffers
message CreateSDPResponse {
string session_id = 1;
string peer_connection_id = 2;
string sdp = 3;
SDPType sdp_type = 4;
}
To set the remote description for a peer connection of an active session:
grpcurl -plaintext -import-path ./proto -proto webrtc.proto -d '{"sessionId": "9s-KsEPQkO_IgfINBV4x6", "peerConnectionId": "py7cllxbm--cyw93x7k4p", "sdp": "", "sdp_type": "ANSWER"}' [::]:50051 webrtc.WebRtc/SetRemotelDescription
Request Protocol Buffers
message AddTrackRequest {
string session_id = 1;
string peer_connection_id = 2;
string track_id = 3;
string track_label = 4;
}
To add a track to a peer connection of an active session:
grpcurl -plaintext -import-path ./proto -proto webrtc.proto -d '{"sessionId": "9s-KsEPQkO_IgfINBV4x6", "peerConnectionId": "py7cllxbm--cyw93x7k4p", "track_id": "", "track_label": ""}' [::]:50051 webrtc.WebRtc/AddTrack
Request Protocol Buffers
message AddTransceiverRequest {
string session_id = 1;
string peer_connection_id = 2;
string track_id = 3;
string track_label = 4;
}
To add a transceiver to a peer connection of an active session:
grpcurl -plaintext -import-path ./proto -proto webrtc.proto -d '{"sessionId": "9s-KsEPQkO_IgfINBV4x6", "peerConnectionId": "py7cllxbm--cyw93x7k4p", "track_id": "", "track_label": ""}' [::]:50051 webrtc.WebRtc/AddTransceiver
Request Protocol Buffers
message GetTransceiversRequest {
string session_id = 1;
string peer_connection_id = 2;
}
Response Protocol Buffers
message GetTransceiversResponse {
repeated Transceiver transceivers = 1;
}
To retrieve transceivers for a peer connection of an active session:
grpcurl -plaintext -import-path ./proto -proto webrtc.proto -d '{"sessionId": "9s-KsEPQkO_IgfINBV4x6", "peerConnectionId": "py7cllxbm--cyw93x7k4p"}' [::]:50051 webrtc.WebRtc/GetTransceivers
Request Protocol Buffers
message ObserverRequest {
string session_id = 1;
string peer_connection_id = 2;
}
Response Protocol Buffers
message IceCandidate {
string sdp = 1;
string mid = 2;
uint32 mline_index = 3;
}
message VideoTransceiver {
string mid = 1;
string direction = 2;
};
enum MediaType {
AUDIO = 0;
VIDEO = 1;
DATA = 2;
UNSUPPORTED = 3;
}
enum TransceiverDirection {
SENDRECV = 0;
SENDONLY = 1;
RECVONLY = 2;
INACTIVE = 3;
}
message Transceiver {
string id = 1;
string mid = 2;
TransceiverDirection direction = 3;
MediaType media_type = 4;
}
message PeerConnectionObserverMessage {
oneof event {
IceCandidate ice_candidate = 1;
VideoTransceiver video_transceiver = 2;
}
}
To retrieve a stream of ice candidate and video transceiver events for a peer connection of an active session:
grpcurl -plaintext -import-path ./proto -proto webrtc.proto -d '{"sessionId": "9s-KsEPQkO_IgfINBV4x6", "peerConnectionId": "py7cllxbm--cyw93x7k4p"}' [::]:50051 webrtc.WebRtc/ObserverRequest