Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
196 changes: 87 additions & 109 deletions core/main/src/firebolt/handlers/discovery_rpc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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},
Expand All @@ -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::{
Expand All @@ -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::{
Expand Down Expand Up @@ -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<bool> {
async fn launch(&self, _ctx: CallContext, request: LaunchRequest) -> RpcResult<bool> {
let app_defaults_configuration = self.state.get_device_manifest().applications.defaults;

let intent_validation_config = self
Expand All @@ -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)
{
Expand All @@ -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::<AppResponse>();

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(
Expand Down Expand Up @@ -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,
Expand Down