iferr:=common.DB.Scopes(withDockFilter(userID,isAdmin)).Where("id = ? AND dock_id = ?",streamSessionID,dockID).First(&session).Error;err!=nil{
iferr:=common.DB.Scopes(withDockFilter(userID,isAdmin)).Where("id = ? AND dock_id = ? AND phase IN ('starting','streaming','reconnecting') AND (expires_at = 0 OR expires_at > ?)",streamSessionID,dockID,time.Now().Unix()).First(&session).Error;err!=nil{
result:=common.DB.Model(&model.LiveViewerLease{}).Where("stream_session_id = ? AND viewer_id = ? AND released_at IS NULL",streamSessionID,userID).Updates(map[string]any{"expires_at":expiresAt,"updated_at":time.Now()})
// A heartbeat may renew only an active lease. In particular, do not
// resurrect a lease that the reconciler has already released or that has
iferr:=common.DB.Model(&model.LiveSession{}).Where("id = ? AND dock_id = ? AND phase IN ('starting','streaming','reconnecting')",streamSessionID,dockID).Updates(map[string]any{"phase":"stopping","stop_reason":"no_balance"}).Error;err!=nil{
_=common.DB.Model(&model.LiveSession{}).Where("id = ? AND dock_id = ? AND phase = 'stopping'",streamSessionID,dockID).Updates(map[string]any{"error_code":"STOP_COMMAND_PUBLISH_FAILED"}).Error
returnnil,common.ErrInternal
}
returncmd,nil
@ -398,7 +421,7 @@ func (s *LiveService) GetPlayURL(userID int64, isAdmin bool, dockID, sessionID s
returnnil,busiErr
}
varsessionmodel.LiveSession
query:=common.DB.Scopes(withDockFilter(userID,isAdmin)).Where("dock_id = ? AND phase = 'streaming'",dockID)
query:=common.DB.Scopes(withDockFilter(userID,isAdmin)).Where("dock_id = ? AND phase = 'streaming' AND (expires_at = 0 OR expires_at > ?)",dockID,time.Now().Unix())
ifsessionID!=""{
query=query.Where("id = ?",sessionID)
}else{
@ -440,6 +463,7 @@ func (s *LiveService) OnCommandAck(cmd *model.DeviceCommandLog, accepted bool, r