diff --git a/core/main/src/firebolt/handlers/discovery_rpc.rs b/core/main/src/firebolt/handlers/discovery_rpc.rs index e4ee6fb50..36517ad23 100644 --- a/core/main/src/firebolt/handlers/discovery_rpc.rs +++ b/core/main/src/firebolt/handlers/discovery_rpc.rs @@ -18,8 +18,8 @@ use std::time::Duration; use crate::{ - firebolt::handlers::privacy_rpc::PrivacyImpl, - firebolt::rpc::RippleRPCProvider, + broker::broker_utils::BrokerUtils, + firebolt::{handlers::privacy_rpc::PrivacyImpl, rpc::RippleRPCProvider}, service::apps::{ app_events::{AppEventDecorationError, AppEventDecorator, AppEvents}, provider_broker::{self, ProviderBroker}, @@ -34,7 +34,7 @@ use jsonrpsee::{ use ripple_sdk::{ api::{ - apps::{AppError, AppManagerResponse, AppMethod, AppRequest, AppResponse}, + apps::{AppError, AppManagerResponse, AppMethod, AppRequest}, firebolt::{ fb_capabilities::FireboltCap, fb_discovery::{ @@ -45,7 +45,7 @@ use ripple_sdk::{ provider::{ProviderRequestPayload, ProviderResponse, ProviderResponsePayload}, }, }, - log::{error, info}, + log::{debug, error, info}, tokio::{sync::oneshot, time::timeout}, }; use ripple_sdk::{ @@ -251,7 +251,7 @@ impl DiscoveryServer for DiscoveryImpl { DiscoveryImpl::get_content_policy(&ctx, &self.state, &ctx.app_id).await } - async fn launch(&self, ctx: CallContext, request: LaunchRequest) -> RpcResult { + async fn launch(&self, _ctx: CallContext, request: LaunchRequest) -> RpcResult { let app_defaults_configuration = self.state.get_device_manifest().applications.defaults; let intent_validation_config = self @@ -261,8 +261,6 @@ impl DiscoveryServer for DiscoveryImpl { .intent_validation; validate_navigation_intent(intent_validation_config, request.intent.clone()).await?; - let req_updated_source = update_intent_source(ctx.app_id.clone(), request.clone()); - if let Some(reserved_app_id) = app_defaults_configuration.get_reserved_application_id(&request.app_id) { @@ -276,45 +274,25 @@ impl DiscoveryServer for DiscoveryImpl { )); } - // Not validating the intent, pass-through to app as is. - if !AppEvents::is_app_registered_for_event( - &self.state, - reserved_app_id.to_string(), - DISCOVERY_EVENT_ON_NAVIGATE_TO, - ) { - return Err(rpc_navigate_reserved_app_err( - format!("Discovery.launch: reserved app id {} is not registered for discovery.onNavigateTo event", - reserved_app_id).as_str(), - )); - } - // emit EVENT_ON_NAVIGATE_TO to the reserved app. - AppEvents::emit_to_app( - &self.state, - reserved_app_id.to_string(), - DISCOVERY_EVENT_ON_NAVIGATE_TO, - &serde_json::to_value(req_updated_source.intent).unwrap(), + match BrokerUtils::process_internal_main_request( + &self.state.clone(), + "discovery.launch.internal", + Some(serde_json::to_value(request).map_err(|e| { + error!("Serialization error: {:?}", e); + rpc_err("Failed to serialize LaunchIntent") + })?), ) - .await; - info!( - "emit_to_app called for app {} event {}", - reserved_app_id.to_string(), - DISCOVERY_EVENT_ON_NAVIGATE_TO - ); - return Ok(true); - } - let (app_resp_tx, app_resp_rx) = oneshot::channel::(); - - let app_request = - AppRequest::new(AppMethod::Launch(req_updated_source.clone()), app_resp_tx); - - if self - .state - .get_client() - .send_app_request(app_request) - .is_ok() - && app_resp_rx.await.is_ok() - { - return Ok(true); + .await + { + Ok(val) => { + debug!("Internal subscription launch successful"); + return Ok(val.as_bool().unwrap_or(false)); + } + Err(e) => { + error!("Internal subscription launch failed: {:?}", e); + return Err(rpc_err("Internal subscription launch failed")); + } + } } Err(jsonrpsee::core::Error::Custom(String::from( @@ -493,70 +471,70 @@ impl DiscoveryServer for DiscoveryImpl { Ok(true) } } -fn update_intent_source(source_app_id: String, request: LaunchRequest) -> LaunchRequest { - let source = format!("xrn:firebolt:application:{}", source_app_id); - match request.intent.clone() { - Some(NavigationIntent::NavigationIntentStrict(navigation_intent)) => { - let updated_navigation_intent = match navigation_intent { - NavigationIntentStrict::Home(mut home_intent) => { - home_intent.context.source = source; - NavigationIntentStrict::Home(home_intent) - } - NavigationIntentStrict::Launch(mut launch_intent) => { - launch_intent.context.source = source; - NavigationIntentStrict::Launch(launch_intent) - } - NavigationIntentStrict::Entity(mut entity_intent) => { - entity_intent.context.source = source; - NavigationIntentStrict::Entity(entity_intent) - } - NavigationIntentStrict::Playback(mut playback_intent) => { - playback_intent.context.source = source; - NavigationIntentStrict::Playback(playback_intent) - } - NavigationIntentStrict::Search(mut search_intent) => { - search_intent.context.source = source; - NavigationIntentStrict::Search(search_intent) - } - NavigationIntentStrict::Section(mut section_intent) => { - section_intent.context.source = source; - NavigationIntentStrict::Section(section_intent) - } - NavigationIntentStrict::Tune(mut tune_intent) => { - tune_intent.context.source = source; - NavigationIntentStrict::Tune(tune_intent) - } - NavigationIntentStrict::ProviderRequest(mut provider_request_intent) => { - provider_request_intent.context.source = source; - NavigationIntentStrict::ProviderRequest(provider_request_intent) - } - NavigationIntentStrict::PlayEntity(mut p) => { - p.context.source = source; - NavigationIntentStrict::PlayEntity(p) - } - NavigationIntentStrict::PlayQuery(mut p) => { - p.context.source = source; - NavigationIntentStrict::PlayQuery(p) - } - }; - - LaunchRequest { - app_id: request.app_id, - intent: Some(NavigationIntent::NavigationIntentStrict( - updated_navigation_intent, - )), - } - } - Some(NavigationIntent::NavigationIntentLoose(mut loose_intent)) => { - loose_intent.context.source = source; - LaunchRequest { - app_id: request.app_id, - intent: Some(NavigationIntent::NavigationIntentLoose(loose_intent)), - } - } - _ => request, - } -} +// fn update_intent_source(source_app_id: String, request: LaunchRequest) -> LaunchRequest { +// let source = format!("xrn:firebolt:application:{}", source_app_id); +// match request.intent.clone() { +// Some(NavigationIntent::NavigationIntentStrict(navigation_intent)) => { +// let updated_navigation_intent = match navigation_intent { +// NavigationIntentStrict::Home(mut home_intent) => { +// home_intent.context.source = source; +// NavigationIntentStrict::Home(home_intent) +// } +// NavigationIntentStrict::Launch(mut launch_intent) => { +// launch_intent.context.source = source; +// NavigationIntentStrict::Launch(launch_intent) +// } +// NavigationIntentStrict::Entity(mut entity_intent) => { +// entity_intent.context.source = source; +// NavigationIntentStrict::Entity(entity_intent) +// } +// NavigationIntentStrict::Playback(mut playback_intent) => { +// playback_intent.context.source = source; +// NavigationIntentStrict::Playback(playback_intent) +// } +// NavigationIntentStrict::Search(mut search_intent) => { +// search_intent.context.source = source; +// NavigationIntentStrict::Search(search_intent) +// } +// NavigationIntentStrict::Section(mut section_intent) => { +// section_intent.context.source = source; +// NavigationIntentStrict::Section(section_intent) +// } +// NavigationIntentStrict::Tune(mut tune_intent) => { +// tune_intent.context.source = source; +// NavigationIntentStrict::Tune(tune_intent) +// } +// NavigationIntentStrict::ProviderRequest(mut provider_request_intent) => { +// provider_request_intent.context.source = source; +// NavigationIntentStrict::ProviderRequest(provider_request_intent) +// } +// NavigationIntentStrict::PlayEntity(mut p) => { +// p.context.source = source; +// NavigationIntentStrict::PlayEntity(p) +// } +// NavigationIntentStrict::PlayQuery(mut p) => { +// p.context.source = source; +// NavigationIntentStrict::PlayQuery(p) +// } +// }; + +// LaunchRequest { +// app_id: request.app_id, +// intent: Some(NavigationIntent::NavigationIntentStrict( +// updated_navigation_intent, +// )), +// } +// } +// Some(NavigationIntent::NavigationIntentLoose(mut loose_intent)) => { +// loose_intent.context.source = source; +// LaunchRequest { +// app_id: request.app_id, +// intent: Some(NavigationIntent::NavigationIntentLoose(loose_intent)), +// } +// } +// _ => request, +// } +// } pub async fn validate_navigation_intent( intent_validation_config: IntentValidation,