...
| PlantUML Macro |
|---|
|
@startuml
autonumber
participant ApplicationManager
participant RialtoServerManager
ApplicationManager -> RialtoServerManager: create(state_observer, config)
note right: config allows app manager to specify number of preloaded servers, path to RialtoApplicationSessionServer binary, startup timer and heathcheck interval
RialtoServerManager -> RialtoServerManager: Read Rialto-Config json file and load config.
RialtoServerManager -> RialtoServerManager: Read Rialto-Config json overrides file and override config.
loop For num of preloaded server
ref over ApplicationManagerRialtoServerManager, RialtoApplicationSessionServer : [[#RialtoApplicationSessionManagement-NotRunning→Unitialized(serverpreloading) Not Running→Unitialized (server preloading)]]
end
RialtoServerManager --> ApplicationManager:
@enduml |
Rialto
...
Rialto Application State Changes
...
| PlantUML Macro |
|---|
|
@startuml
autonumber
participant RialtoServerManager
RialtoServerManager -> RialtoServerManager: Generate socketpair for Rialto Application Session Server to Server Manager communication
RialtoServerManager -> RialtoApplicationSessionServer **: Spawn(server_manager_socket)
note left
Spawn preloaded Application
Session Servers to speed up app launch time.
end note
RialtoServerManager -> RialtoServerManager: Start [startup] second READY timer
RialtoApplicationSessionServer -> RialtoApplicationSessionServer: Set current_state = Uninitialised
alt RialtoApplicationSessionServer started successfully
RialtoApplicationSessionServer -// RialtoServerManager: stateChanged(AppState::Uninitialised)
RialtoServerManager -> RialtoServerManager: Cancel READY timer
else Session Server initialisation failed
RialtoApplicationSessionServer -// RialtoServerManager:RialtoServerManager -> RialtoServerManager: stateChanged(AppState::Error)
RialtoServerManager Cancel READY timer
RialtoApplicationSessionServer -> RialtoServerManagerRialtoApplicationSessionServer: Unbind/free session management socket Cancel READY timer(if created)
RialtoApplicationSessionServer -> RialtoApplicationSessionServer !!: Exit process
else READY timer expired
RialtoServerManager -> RialtoServerManager: Kill spawned Rialto Application Session Server process
RialtoApplicationSessionServer -> RialtoApplicationSessionServer: Unbind/free session management socket (if created)
end
@enduml |
Not Running (no server preloading)/Unitialized (server preloading)→Inactive
| PlantUML Macro |
|---|
| format | SVG |
|---|
| title | Not Running to Inactive |
|---|
|
@startuml
autonumber
participant ApplicationManager
participant RialtoServerManager
ApplicationManager -> RialtoServerManager: initiateApplication(application_id, AppState::Inactive, app_config)
note
alt right: app_config allows app manager to specify the socket name to use for Rialto client/server session management and the socket name for communication with a display server
opt session_management_socket_name not specified in app_config
RialtoServerManager -> RialtoServerManager:There are no preloaded servers
RialtoServerManager -> RialtoServerManager: Generate socketpair for Rialto Application Session Server to Server Manager communication
RialtoServerManager -> RialtoApplicationSessionServer Generate unique session_management_socket_name for Rialto Client to Rialto Application Session Server communication
end
alt There are no preloaded servers
RialtoServerManager**: Spawn(server_manager_socket)
RialtoServerManager -> RialtoServerManager: -> RialtoServerManager: Start [startup] second READY timer
RialtoApplicationSessionServer -> RialtoApplicationSessionServer: Set current_state = Generate socketpair for Rialto Application Session Server to Server Manager communication
RialtoServerManagerUninitialised
alt RialtoApplicationSessionServer started successfully
RialtoApplicationSessionServer -// RialtoServerManager: -> RialtoApplicationSessionServer **: Spawn(server_manager_socketstateChanged(AppState::Uninitialised)
RialtoServerManager -> RialtoServerManager: Start [startup] second Cancel READY timer
RialtoServerManager -->// ApplicationManager: OK/ERROR
RialtoApplicationSessionServer -> RialtoApplicationSessionServer: Set current_state = Uninitialised
alt RialtoApplicationSessionServer started successfully
stateChanged(application_id, AppState::Uninitialised)
ref over ApplicationManager, RialtoApplicationSessionServer : [[#RialtoApplicationSessionManagement-Unitialized→Inactive Unitialized→Inactive]]
else Session Server initialisation failed
RialtoApplicationSessionServer -> RialtoApplicationSessionServer: Unbind/free session management socket (if created)
RialtoApplicationSessionServer -// RialtoServerManager: stateChanged(AppState::UninitialisedError)
RialtoServerManager -> RialtoServerManager: Cancel READY timer
RialtoApplicationSessionServer -> RialtoApplicationSessionServer !!: Exit process
RialtoServerManager -// ApplicationManager: stateChanged(application_id, AppState::Uninitialised)
Error)
else READY timer expired
RialtoServerManager -> RialtoApplicationSessionServerRialtoServerManager: SetConfiguration(session_management_socket_name, AppState::Inactive, resources, log_level)
note right
"resources" structure will specify the maximum decoder resources that the
application is permitted to use. For now it shall have a max_playback_sessions
property and a supports_web_audio flag. This may be enhanced for things like
HD/UHD, audio only etc in future.
end note
RialtoApplicationSessionServer --> RialtoServerManager:
RialtoApplicationSessionServer -> RialtoApplicationSessionServer: Create listening socket & bind to session_management_socket_name
alt State transition successful
RialtoApplicationSessionServer -> RialtoApplicationSessionServer: Set current_state = Inactive
RialtoApplicationSessionServer -// RialtoServerManager: stateChanged(AppState::Inactive) Kill spawned Rialto Application Session Server process
RialtoServerManager -// ApplicationManager: stateChanged(application_id, AppState::Error)
end
else There are preloaded servers
note over ApplicationManager, RialtoApplicationSessionServer: Pick 1st free preloaded server (it's already in unitialized state)
ref over ApplicationManager, RialtoApplicationSessionServer : [[#RialtoApplicationSessionManagement-Unitialized→Inactive Unitialized→Inactive]]
RialtoServerManager -//-> ApplicationManager: StateChanged(application_id, AppState::Inactive)
ApplicationManager -> RialtoServerManager: getAppConnectionInfo()OK/ERROR
end
@enduml |
Unitialized→Inactive
| PlantUML Macro |
|---|
| format | SVG |
|---|
| title | Not Running to Inactive |
|---|
|
@startuml
autonumber
participant ApplicationManager
participant RialtoServerManager
opt session_management_socket_name not specified in app_config
RialtoServerManager --> ApplicationManager RialtoServerManager: Generate unique session_management_socket_name
else State transition failed
RialtoApplicationSessionServer -> RialtoApplicationSessionServer: Unbind/free session management socket (if created)
RialtoApplicationSessionServer -// RialtoServerManager: stateChanged(AppState::Error) for Rialto Client to Rialto Application Session Server communication
end
note right
"app_config allows app manager to specify the socket name
to use for Rialto client/server session management
and the socket name for communication with a display server"
end note
RialtoServerManager -//> ApplicationManagerRialtoApplicationSessionServer: SetConfiguration(session_management_socket_name, AppState::Inactive, resources, log_level, display_name)
note right
"resources" structure will specify the maximum decoder stateChanged(application_id, AppState::Error)
RialtoApplicationSessionServer -> RialtoApplicationSessionServer !!: Exit process
end
else Session Server initialisation failed
RialtoApplicationSessionServer -> RialtoApplicationSessionServer: Unbind/free session management socket (if created)
RialtoApplicationSessionServer -// RialtoServerManager: stateChanged(AppState::Error)
RialtoServerManager -> RialtoServerManager: Cancel READY timer
RialtoApplicationSessionServer -> RialtoApplicationSessionServer !!: Exit processresources that the
application is permitted to use. For now it shall have a max_playback_sessions
property and a supports_web_audio flag. This may be enhanced for things like
HD/UHD, audio only etc in future.
end note
RialtoApplicationSessionServer --> RialtoServerManager:
RialtoApplicationSessionServer -> RialtoApplicationSessionServer: Create listening socket & bind to session_management_socket_name
opt display_name defined
RialtoApplicationSessionServer -> RialtoApplicationSessionServer: Set WAYLAND_DISPLAY environment variable
end
alt State transition successful
RialtoApplicationSessionServer -> RialtoApplicationSessionServer: Set current_state = Inactive
RialtoApplicationSessionServer -// RialtoServerManager: stateChanged(AppState::Inactive)
RialtoServerManager -// ApplicationManager: stateChangedStateChanged(application_id, AppState::ErrorInactive)
else READY timer expired
RialtoServerManagerApplicationManager -> RialtoServerManager: Kill spawned Rialto Application Session Server processgetAppConnectionInfo()
RialtoServerManager -//-> ApplicationManager: stateChanged(application_id, AppState::Error)
end
end
@enduml |
Unitialized→Inactive
session_management_socket_name
else State transition failed
RialtoApplicationSessionServer -> RialtoApplicationSessionServer: Unbind/free session management socket (if created)
RialtoApplicationSessionServer -// RialtoServerManager: stateChanged(AppState::Error)
RialtoServerManager -// ApplicationManager: stateChanged(application_id, AppState::Error)
RialtoApplicationSessionServer -> RialtoApplicationSessionServer !!: Exit process
end
opt Server preloading is active
note over ApplicationManager, RialtoApplicationSessionServer: Preload RialtoApplicationSessionServer in place of the one that has just been allocated
ref over ApplicationManager, RialtoApplicationSessionServer : [[#RialtoApplicationSessionManagement-NotRunning→Unitialized(serverpreloading) Not Running→Unitialized (server preloading)]]
end
@enduml |
3. socketpair is used to create the point-to-point IPC channel used for all Rialto Server Manager to Rialto Application Session Server communications
8. Application Session Server sends first message so Server Manager knows that it is now up and running
13. Session server creates the socket that the app will use for sending AV data and control respectively.
17/18. Server Manager has an API to allow the Application Manager to get the socket name that the App will use for communication with Rialto which it should fetch as soon as it is notified that Rialto has moved the app out of the Not Running state so that it can be passed to the app/container when it is launched (this is optional as the app manager can supply the socket name in step 1)
Inactive→Active
| PlantUML Macro |
|---|
| format | SVG |
|---|
| title | Inactive to Active |
|---|
|
@startuml
autonumber
participant ApplicationManager
participant RialtoServerManager
participant RialtoApplicationSessionServer
ApplicationManager |
| PlantUML Macro |
|---|
| format | SVG |
|---|
| title | Not Running to Inactive |
|---|
|
@startuml
autonumber
participant ApplicationManager
participant RialtoServerManager
RialtoServerManager -> RialtoApplicationSessionServer: SetConfiguration(session_management_socket_name, AppState::Inactive, resources, log_level, display_name)
note right
"resources" structure will specify the maximum decoder resources that the
application is permitted to use. For now it shall have a max_playback_sessions
property and a supports_web_audio flag. This may be enhanced for things like
HD/UHD, audio only etc in future.
end note
RialtoApplicationSessionServer --> RialtoServerManager:
RialtoApplicationSessionServer -> RialtoApplicationSessionServer: Create listening socket & bind to session_management_socket_name
opt display_name defined
RialtoApplicationSessionServer -> RialtoApplicationSessionServer: Set WAYLAND_DISPLAY environment variable
end
alt State transition successful
RialtoApplicationSessionServer -> RialtoApplicationSessionServer: Set current_state = Inactive
RialtoApplicationSessionServer -// RialtoServerManager: stateChanged(AppState::Inactive)
RialtoServerManager -// ApplicationManager: StateChanged(application_id, AppState::Inactive)
ApplicationManager -> RialtoServerManager: getAppConnectionInfo(changeSessionServerState(application_id, AppState::Active)
RialtoServerManager --> ApplicationManager RialtoApplicationSessionServer: SetState(AppState::Active)
RialtoApplicationSessionServer --> RialtoServerManager: session_management_socket_name
else State transition failed
RialtoApplicationSessionServer -> OK/ERROR
RialtoServerManager RialtoApplicationSessionServer: Unbind/free session management socket (if created)
RialtoApplicationSessionServer -//-> RialtoServerManagerApplicationManager: stateChanged(AppState::Error)
RialtoServerManager OK/ERROR
RialtoApplicationSessionServer -> RialtoApplicationSessionServer: Allocate shared memory buffer
opt State transition successful
RialtoApplicationSessionServer -//> ApplicationManagerRialtoApplicationSessionServer: Set current_state = Active
RialtoApplicationSessionServer -// RialtoServerManager: stateChanged(application_id, AppState::ErrorActive)
RialtoApplicationSessionServer -> RialtoApplicationSessionServer !!: Exit process
end
opt Server preloading is active
ref over ApplicationManager, RialtoApplicationSessionServer : [[#RialtoApplicationSessionManagement-NotRunning→Unitialized(serverpreloading) Not Running→Unitialized (server preloading)]]
end
@enduml |
3. socketpair is used to create the point-to-point IPC channel used for all Rialto Server Manager to Rialto Application Session Server communications
8. Application Session Server sends first message so Server Manager knows that it is now up and running
13. Session server creates the socket that the app will use for sending AV data and control respectively.
17/18. Server Manager has an API to allow the Application Manager to get the socket name that the App will use for communication with Rialto which it should fetch as soon as it is notified that Rialto has moved the app out of the Not Running state so that it can be passed to the app/container when it is launched (this is optional as the app manager can supply the socket name in step 1)
Inactive→Active
RialtoServerManager -// ApplicationManager: stateChanged(application_id, AppState::Active)
else State transition failed
RialtoApplicationSessionServer -> RialtoApplicationSessionServer: Free shared memory buffer if allocated
RialtoApplicationSessionServer -// RialtoServerManager: stateChanged(AppState::Error)
RialtoServerManager -// ApplicationManager: stateChanged(application_id, AppState::Error)
end
@enduml |
2. RialtoServerManager will need to look up which RialtoApplicationSessionServer to which to send the notification
Not Running→Active
Same sequence as Not Running→Inactive but change target state to Active and allocate shared memory buffer after creating session management socket.
Active→Inactive
| PlantUML Macro |
|---|
| format | SVG |
|---|
| title | Active to Inactive |
|---|
|
@startuml
autonumber |
| PlantUML Macro |
|---|
| format | SVG |
|---|
| title | Inactive to Active |
|---|
|
@startuml
autonumber
participant ApplicationManager
participant RialtoServerManager
participant RialtoApplicationSessionServer
ApplicationManager -> RialtoServerManager: changeSessionServerState(application_id, AppState::ActiveInactive)
RialtoServerManager -> RialtoApplicationSessionServer: SetState(AppState::ActiveInactive)
RialtoApplicationSessionServer --> RialtoServerManager: OK/ERROR
RialtoServerManager --> ApplicationManager: OK/ERROR
RialtoApplicationSessionServer -> RialtoApplicationSessionServer: AllocateFree any sharedremaining memoryCDM buffer
opt State transition successfulresources
RialtoApplicationSessionServer -> RialtoApplicationSessionServer: Free any remaining Player resources
RialtoApplicationSessionServer -> RialtoApplicationSessionServer: Unmap/free shared memory buffer
RialtoApplicationSessionServer -> RialtoApplicationSessionServer: Set current_state = ActiveInactive
RialtoApplicationSessionServer -// RialtoServerManager: stateChanged(AppState::ActiveInactive)
RialtoServerManager -// ApplicationManager: stateChanged(application_id, AppState::Active)
else State transition failed
RialtoApplicationSessionServer -> RialtoApplicationSessionServer:Inactive)
@enduml |
6. Free any Player resources means close any open GStreamer pipelines, for example those used for AV playback and/or UI audio.
Inactive→Not Running
| PlantUML Macro |
|---|
| format | SVG |
|---|
| title | Inactive to Not Running |
|---|
|
@startuml
autonumber
participant ApplicationManager
participant RialtoServerManager
participant RialtoApplicationSessionServer
ApplicationManager Free shared memory buffer if allocated
RialtoApplicationSessionServer -//-> RialtoServerManager: stateChangedchangeSessionServerState(application_id, AppState::ErrorNotRunning)
RialtoServerManager -// ApplicationManager> RialtoApplicationSessionServer: SetState(AppState::NotRunning)
RialtoApplicationSessionServer -> RialtoApplicationSessionServer: Close IPC connection with app
RialtoApplicationSessionServer -> RialtoApplicationSessionServer: Set stateChanged(application_id, AppState::Error)
end
@enduml |
2. RialtoServerManager will need to look up which RialtoApplicationSessionServer to which to send the notification
Not Running→Active
Same sequence as Not Running→Inactive but change target state to Active and allocate shared memory buffer after creating session management socket.
Active→Inactive
| PlantUML Macro |
|---|
| format | SVG |
|---|
| title | Active to Inactive |
|---|
|
@startuml
autonumber
participant ApplicationManager
participant RialtoServerManager
participant RialtoApplicationSessionServer
ApplicationManagercurrent_state = NotRunning
RialtoApplicationSessionServer -// RialtoServerManager: -> RialtoServerManager: changeSessionServerState(application_id, stateChanged(AppState::InactiveNotRunning)
RialtoServerManager RialtoApplicationSessionServer -> RialtoApplicationSessionServer !!: SetState(AppState::Inactive)
RialtoApplicationSessionServer --> RialtoServerManager:Exit process
RialtoServerManager -// ApplicationManager: OK/ERROR
RialtoServerManager --> ApplicationManager: OK/ERROR
RialtoApplicationSessionServer -> RialtoApplicationSessionServer: Free any remaining CDM resources
RialtoApplicationSessionServer -> RialtoApplicationSessionServer: Free any remaining Player resources
RialtoApplicationSessionServer -> RialtoApplicationSessionServer: Unmap/free shared memory buffer
RialtoApplicationSessionServer -> RialtoApplicationSessionServer: Set current_state = Inactive
RialtoApplicationSessionServer -// RialtoServerManager: stateChanged(AppState::Inactive)
RialtoServerManager -// ApplicationManager: stateChanged(application_id, AppState::Inactive)
@enduml |
6. Free any Player resources means close any open GStreamer pipelines, for example those used for AV playback and/or UI audio.
Inactive→Not Running
stateChanged(application_id, AppState::NotRunning)
@enduml |
6. The Session Server process should self terminate once it has sent the NotRunning notification to the Server Manager.
Active→Not Running
Not shown for brevity, but should perform all of the cleanup operations in Rialto Sessions server shown in Active→Inactive & Inactive->Not Running.
Application Management
Start Application in Inactive State
| PlantUML Macro |
|---|
| format | SVG |
|---|
| title | Launch application in Inactive state |
|---|
|
@startuml
autonumber
participant ApplicationManager
participant RialtoApplicationSessionServer
ref over ApplicationManager, RialtoApplicationSessionServer : [[#RialtoApplicationSessionManagement-NotRunning→Inactive Not Running to Inactive]]
ApplicationManager |
| PlantUML Macro |
|---|
| format | SVG |
|---|
| title | Inactive to Not Running |
|---|
|
@startuml
autonumber
participant ApplicationManager
participant RialtoServerManager
participant RialtoApplicationSessionServer
ApplicationManager -> RialtoServerManager: changeSessionServerState(application_id, AppState::NotRunning)
RialtoServerManager -> RialtoApplicationSessionServer: SetState(AppState::NotRunning)
RialtoApplicationSessionServer -> RialtoApplicationSessionServer: Close IPC connection with app
RialtoApplicationSessionServer -> RialtoApplicationSessionServer: Set current_state = NotRunning
RialtoApplicationSessionServer -// RialtoServerManager: stateChanged(AppState::NotRunning)
RialtoApplicationSessionServer -> RialtoApplicationSessionServer !!: Exit process
RialtoServerManager -// ApplicationManager: stateChanged(application_id, AppState::NotRunning)
@enduml |
6. The Session Server process should self terminate once it has sent the NotRunning notification to the Server Manager.
Active→Not Running
Not shown for brevity, but should perform all of the cleanup operations in Rialto Sessions server shown in Active→Inactive & Inactive->Not Running.
Application Management
Start Application in Inactive State
| PlantUML Macro |
|---|
| format | SVG |
|---|
| title | Launch application in Inactive state |
|---|
|
@startuml
autonumber
participant ApplicationManager
participant RialtoApplicationSessionServer
ref over ApplicationManager, RialtoApplicationSessionServer : [[#RialtoApplicationSessionManagement-NotRunning→Inactive Not Running to Inactive]]
ApplicationManager-> Application ** : Spawn(AppState::Inactive, listening_socket_name)
Application -> RialtoClient ** : Load RialtoClient library
Application -> ApplicationRialtoClient **: : Spawn(AppState::Inactive, listening_socket_name)
Application registerClient()
RialtoClient -> RialtoClient ** : Load RialtoClient library
RialtoClientRialtoApplicationSessionServer: Connect(rialto_listening_socket)
note right
Connect is not an API call, it is establishing IPC channel with server
end note
opt first registerClient call
RialtoClient -> RialtoApplicationSessionServer: Connect(rialto_listening_socket)
note right
Connect is not an API call, it is establishing IPC channel with server
end note registerClient()
RialtoApplicationSessionServer --> RialtoClient: status, AppState::Inactive
end
RialtoClient --> Application: status, AppState::Inactive
Application -// ApplicationManager: stateChanged(AppState::Inactive)
@enduml |
...
| PlantUML Macro |
|---|
| format | SVG |
|---|
| title | Launch application in Running state |
|---|
|
@startuml
autonumber
participant ApplicationManager
participant RialtoApplicationSessionServer
ref over ApplicationManager, RialtoApplicationSessionServer : [[#RialtoApplicationSessionManagement-NotRunning→Active Not Running to Active]]
ApplicationManager -> Application ** : Spawn(AppState::Running, listening_socket_name)
Application -> RialtoClient ** : load RialtoClient library
Application -> RialtoClient : load RialtoClient libraryregisterClient()
RialtoClient -> RialtoApplicationSessionServer: Connect(rialto_listening_socket)
note right
Connect is not an API call, it is establishing IPC channel with server
end note
RialtoClient
opt first registerClient call
RialtoClient --> ApplicationRialtoApplicationSessionServer:
Application registerClient()
RialtoApplicationSessionServer --> RialtoClient: setApplicationState(Running)status, AppState::Running
end
RialtoClient -> RialtoApplicationSessionServer: GetSharedMemory()
RialtoApplicationSessionServer --> RialtoClient: shm_fd
RialtoClient -> RialtoClient: Map shared memory
RialtoClient --> Application: status, AppState::Running
Application -// ApplicationManager: stateChanged(AppState::Running)
@enduml |
Switch Application from Inactive to Running State
| PlantUML Macro |
|---|
| format | SVG |
|---|
| title | Application state change: Inactive to Running |
|---|
|
@startuml
autonumber
participant ApplicationManager
participant RialtoApplicationSessionServer
participant Application
participant RialtoClient
ref over ApplicationManager, RialtoApplicationSessionServer : [[#RialtoApplicationSessionManagement-Inactive→Active Inactive to Active]]
ApplicationManager RialtoApplicationSessionServer -> Application RialtoClient: NotifyNewStatestateChanged(AppState::Running)
Application RialtoClient -> RialtoClientApplication: setApplicationState stateChanged(AppState::Running)
RialtoClient -> RialtoApplicationSessionServer: GetSharedMemory()
RialtoApplicationSessionServer --> RialtoClient: shm_fd
RialtoClient -> RialtoClient: Map shared memory
RialtoClient --> Application: status
ApplicationManager -> Application : NotifyNewState(AppState::Running)
Application -// ApplicationManager: stateChanged(AppState::Running)
@enduml |
...
| PlantUML Macro |
|---|
| format | SVG |
|---|
| title | Application state change: Running to Inactive |
|---|
|
@startuml
autonumber
participant ApplicationManager
participant RialtoApplicationSessionServer
participant Application
participant RialtoClient
ApplicationManager
participant RialtoClient
ApplicationManager -> Application : NotifyNewState(AppState::Inactive)
Application --> ApplicationManager:
RialtoApplicationSessionServer -> RialtoClient: setApplicationState stateChanged(AppState::Inactive)
RialtoClient -> RialtoClient : Free CDM & Player resources
RialtoClient -> RialtoClient: Unmap shared memory
RialtoClient --> Application: status
Application --> Application: -// ApplicationManager: stateChanged(AppState::Inactive)
ref over ApplicationManager, RialtoApplicationSessionServer : [[#RialtoApplicationSessionManagement-Active→Inactive Active to Inactive]]
@enduml
|
Stop Application from Inactive State
...