elegant-coat-98622
07/09/2025, 2:06 PMflowchart TD
%% ─── Client calls SDK ───
A["Client / SDK<br>startRoomEgress()"] -- "Twirp RPC<br>StartRoomCompositeEgress" |--> B["LiveKit Server"]
%% ─── Server decision tree ───
subgraph Server
B --> C{{"Room exists?"}}
C -- "no" --> X1["404<br>room not found"]
C -- "yes" --> D["Lookup<br>worker registry"]
D --> E{{"Worker available<br>& CPU OK?"}}
E -- "none" --> X2["Twirp<br>not_found"]
E -- "all busy" --> X3["Twirp<br>unavailable"]
E -- "yes" --> F["Pick worker &<br>reserve CPU"]
F -- "PSRPC<br>enqueue job" |--> G
F -- "EgressInfo<br>EGRESS_STARTING" |--> A
end
%% ─── Worker lifecycle ───
subgraph "Egress Worker"
G["Egress Pod"] --> H["set egress_available = 0"]
H --> I["FFmpeg / Chrome"]
I --> J["webhook<br>egress_started"]
I --> K["do recording"]
K --> L["webhook<br>egress_finished|failed"]
L --> M["egress_available = 1"]
M -.-> D
end
tall-airline-16756
07/09/2025, 2:06 PMtall-airline-16756
07/09/2025, 2:07 PM