Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

PlantUML Macro
formatSVG
@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, READYstartup timer and heathcheck interval
loop For num of preloaded server
RialtoServerManager            ->  RialtoServerManager:               Generate socketpair for Rialto Application Session Server to Server Manager communication
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 RialtoServerManager, RialtoApplicationSessionServer : [[#RialtoApplicationSessionManagement-NotRunning→Unitialized(serverpreloading) Not Running→Unitialized (server preloading)]] 
end
 RialtoServerManager            --> ApplicationManager:  RialtoApplicationSessionServer   **: Spawn(server_manager  
@enduml


Rialto Application State Changes

Not Running→Unitialized (server preloading)

PlantUML Macro
formatSVG
@startuml

autonumber

participant RialtoServerManager
_socket)
note left
Spawn Application
Session Servers to speed up app launch time.
end note
RialtoServerManager            ->  RialtoServerManager:               Start [1] second READY timerGenerate socketpair for Rialto Application Session Server to Server Manager communication
RialtoServerManager            -->  RialtoApplicationSessionServer ApplicationManager:           **: Spawn(server_manager_socket)
note left
Spawn preloaded Application
Session Servers to speed up app launch time.
end note
RialtoServerManager     OK/ERROR
RialtoApplicationSessionServer       ->  RialtoApplicationSessionServerRialtoServerManager:    Set  current_state =         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
RialtoServerManager          

else Session -// ApplicationManager: Server initialisation failed

RialtoServerManager            ->   stateChanged(application_id, AppState::Uninitialised)
RialtoServerManagerRialtoServerManager:            ->  RialtoApplicationSessionServer: Cancel READY timer
RialtoApplicationSessionServer ->  RialtoApplicationSessionServer:    Unbind/free 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: (if created)
RialtoApplicationSessionServer ->  RialtoApplicationSessionServer !!: Exit process  

else READY timer expired

RialtoServerManager            ->  RialtoServerManager:               Kill spawned Rialto Application Session Server process
RialtoApplicationSessionServer ->  RialtoApplicationSessionServer:    Create listeningUnbind/free session management socket (if created)

end

@enduml

Not Running (no server preloading)/Unitialized (server preloading)→Inactive

PlantUML Macro
formatSVG
titleNot Running to Inactive
@startuml

autonumber

participant ApplicationManager
participant RialtoServerManager

ApplicationManager            & bind to session_management_socket_name

alt State transition successful
RialtoApplicationSessionServer ->  RialtoApplicationSessionServerRialtoServerManager:    Set current_state = Inactive
RialtoApplicationSessionServer -// RialtoServerManager:      initiateApplication(application_id, AppState::Inactive, app_config) 

alt There are no   stateChanged(AppState::Inactive)preloaded servers
RialtoServerManager            -//>  ApplicationManagerRialtoServerManager:                StateChanged(application_id, AppState::Inactive)
ApplicationManager        Generate socketpair for Rialto Application Session Server to Server Manager communication
RialtoServerManager     ->  RialtoServerManager:     ->  RialtoApplicationSessionServer        getAppConnectionInfo(**: Spawn(server_manager_socket)
RialtoServerManager            --> ApplicationManager RialtoServerManager:                session_management_socket_name
else State transition failedStart [startup] second READY timer
RialtoApplicationSessionServer ->  RialtoApplicationSessionServer:    Unbind/free session management socket (if created) Set current_state = Uninitialised

alt RialtoApplicationSessionServer started successfully

RialtoApplicationSessionServer -// RialtoServerManager:               stateChanged(AppState::ErrorUninitialised)
RialtoServerManager            -//>  ApplicationManagerRialtoServerManager:                stateChanged(application_id, AppState::Error)
RialtoApplicationSessionServer ->  RialtoApplicationSessionServer !!: Exit process
end

else Session Server initialisation failed

RialtoApplicationSessionServerCancel READY timer
RialtoServerManager            -// RialtoServerManagerApplicationManager:                stateChanged(application_id, AppState::ErrorUninitialised)
RialtoServerManager
ref over ApplicationManager, RialtoApplicationSessionServer : [[#RialtoApplicationSessionManagement-Unitialized→Inactive Unitialized→Inactive]]  

else Session Server initialisation failed

RialtoApplicationSessionServer ->  RialtoServerManagerRialtoApplicationSessionServer:    Unbind/free session management socket (if created)
RialtoApplicationSessionServer -// RialtoServerManager:               stateChanged(AppState::Error)
RialtoServerManager            ->  RialtoServerManager:               Cancel READY timer
RialtoApplicationSessionServer ->  RialtoApplicationSessionServer !!: Exit process
RialtoServerManager            -// ApplicationManager:                stateChanged(application_id, AppState::Error)

else READY timer expired

RialtoServerManager            ->  RialtoServerManager:               Kill spawned Rialto Application Session Server process
RialtoServerManager            -// ApplicationManager:                stateChanged(application_id, AppState::Error)

end
end

@enduml

Rialto Application State Changes

Not Running→Inactive

PlantUML Macro
formatSVG
titleNot Running to Inactive
@startuml

autonumber

participant ApplicationManager
participant RialtoServerManager

ApplicationManager             ->  RialtoServerManager:  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:                OK/ERROR
end

@enduml

Unitialized→Inactive

PlantUML Macro
formatSVG
titleNot Running to Inactive
@startuml

autonumber

participant ApplicationManager
participant RialtoServerManager 

opt session_management_socket_ initiateApplication(application_id, AppState::Inactive, app_config)
note right: app_config allows app manager to specify the socket name to use for Rialto client/server session management
opt Socket name not specified in app_config
RialtoServerManager            ->  RialtoServerManager:               Generate unique session_management_socket_name for Rialto Client to Rialto Application Session Server communication
end
RialtoServerManagernote right
 "app_config allows app manager to specify the socket name 
 -> to RialtoServerManager:use for Rialto client/server session management 
  and the      Generate socketpairsocket name for Rialtocommunication Applicationwith Sessiona Server to Server Manager communicationdisplay server"
end note


RialtoServerManager            ->  RialtoApplicationSessionServer: **: Spawn(server_manager_socket, session_management_socket_   SetConfiguration(session_management_socket_name, AppState::Inactive, resources, log_level, display_name)
note leftright
Depending"resources" onstructure configuration,will Rialtospecify Serverthe Manager
maymaximum maintaindecoder aresources pool of pre-loaded Application
Session Servers in which case one of these will
be used to speed up app launch time.
end note
RialtoServerManager            ->  RialtoServerManager:               Start [1] second READY timer
RialtoServerManager            --> ApplicationManager:                OK/ERRORthat 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 = UninitialisedInactive

alt RialtoApplicationSessionServer started successfully

RialtoApplicationSessionServer -// RialtoServerManager:               stateChanged(AppState::UninitialisedInactive)
RialtoServerManager            ->//  RialtoServerManagerApplicationManager:               Cancel READY timer
RialtoServerManager StateChanged(application_id, AppState::Inactive)
ApplicationManager             -//>  ApplicationManagerRialtoServerManager:                stateChanged(application_id, AppState::UninitialisedgetAppConnectionInfo()
RialtoServerManager            --> ApplicationManager:           RialtoApplicationSessionServer:     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

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 Setpreloading current_state = Inactive
RialtoApplicationSessionServer -// RialtoServerManager:               stateChanged(AppState::Inactive)
RialtoServerManager            -// ApplicationManager:                StateChanged(application_id, AppState::Inactive)
ApplicationManager             ->  RialtoServerManager:               getAppConnectionInfo()
RialtoServerManager            --> 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
formatSVG
titleInactive to Active
@startuml

autonumber

participant ApplicationManager
participant RialtoServerManager
participant RialtoApplicationSessionServer

ApplicationManagerApplicationManager:                session_management_socket_name
else State transition failed
RialtoApplicationSessionServer ->  RialtoApplicationSessionServer:    Unbind/free session management socket (if created)
RialtoApplicationSessionServer -// RialtoServerManager:               stateChanged(AppState::Error)
RialtoServerManager     ->        -// ApplicationManagerRialtoServerManager:                stateChangedchangeSessionServerState(application_id, AppState::ErrorActive)
RialtoApplicationSessionServerRialtoServerManager  ->  RialtoApplicationSessionServer !!: Exit process
end

else Session Server initialisation failed

RialtoApplicationSessionServer ->  RialtoApplicationSessionServer:    Unbind/free session management socket (if createdSetState(AppState::Active)
RialtoApplicationSessionServer -//-> RialtoServerManager:               stateChanged(AppState::Error)OK/ERROR
RialtoServerManager            -->  RialtoServerManagerApplicationManager:               Cancel READY timerOK/ERROR
RialtoApplicationSessionServer ->  RialtoApplicationSessionServer !!: Exit process
RialtoServerManager    :    Allocate shared memory buffer

opt State transition successful
RialtoApplicationSessionServer ->  RialtoApplicationSessionServer:    Set current_state = Active
RialtoApplicationSessionServer -// ApplicationManagerRialtoServerManager:                stateChanged(application_id, AppState::ErrorActive)

else READY timer expired

RialtoServerManager            ->//  RialtoServerManagerApplicationManager:               Kill spawned Rialto Application Session Server process 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

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


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
formatSVG
titleActive to Inactive
@startuml

autonumber

participant ApplicationManager
participant RialtoServerManager
participant RialtoApplicationSessionServer

ApplicationManager  
PlantUML Macro
formatSVG
titleInactive 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:    Free Allocateany 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
formatSVG
titleInactive 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
formatSVG
titleActive to Inactive
@startuml

autonumber

participant ApplicationManager
participant RialtoServerManager
participant RialtoApplicationSessionServer

ApplicationManagercurrent_state = NotRunning
RialtoApplicationSessionServer -// RialtoServerManager:               stateChanged(AppState::NotRunning)
RialtoApplicationSessionServer ->  RialtoServerManagerRialtoApplicationSessionServer !!: Exit process
RialtoServerManager             changeSessionServerState(application_id, AppState::Inactive)
RialtoServerManager-// ApplicationManager:            ->  RialtoApplicationSessionServer:    SetState(stateChanged(application_id, AppState::InactiveNotRunning)
RialtoApplicationSessionServer --> RialtoServerManager:               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


@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
formatSVG
titleLaunch application in Inactive state
@startuml
autonumber
participant ApplicationManager
participant RialtoApplicationSessionServer
ref over ApplicationManager, RialtoApplicationSessionServer : [[#RialtoApplicationSessionManagement-NotRunning→Inactive Not Running to Inactive]]
ApplicationManager
PlantUML Macro
formatSVG
titleInactive 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
formatSVG
titleLaunch 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
formatSVG
titleLaunch 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
formatSVG
titleApplication 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
formatSVG
titleApplication 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

...