fix(asr): preserve missing fixture sequence status
| | |
| | | } |
| | | } |
| | | |
| | | pub(crate) fn rejected_origin_status( |
| | | reason: &str, |
| | | attributes: &HashMap<String, String>, |
| | | ) -> &'static str { |
| | | let status = Self::origin_status(attributes); |
| | | if status == "sequence_absent" { |
| | | status |
| | | } else { |
| | | Self::rejection_status(reason) |
| | | } |
| | | } |
| | | |
| | | pub(crate) fn from_participant( |
| | | attributes: &HashMap<String, String>, |
| | | ) -> Result<Option<Self>, &'static str> { |
| | |
| | | "origin_unprovable", |
| | | AudioIngressMetadata::rejection_status("unknown") |
| | | ); |
| | | let missing_sequence = HashMap::from([( |
| | | "inputSourceCategory".to_string(), |
| | | "controlled_fixture".to_string(), |
| | | )]); |
| | | assert_eq!( |
| | | "sequence_absent", |
| | | AudioIngressMetadata::rejected_origin_status("incomplete_metadata", &missing_sequence) |
| | | ); |
| | | assert_eq!(8, AudioIngressMetadata::ORIGIN_STATUSES.len()); |
| | | } |
| | | |
| | |
| | | Ok(metadata) => metadata, |
| | | Err(reason) => { |
| | | warn!(call_id = %call_id, trace_id = %trace_id, turn_id = %turn_id, |
| | | reason, audioIngressOriginStatus = %AudioIngressMetadata::rejection_status(reason), |
| | | reason, audioIngressOriginStatus = %AudioIngressMetadata::rejected_origin_status( |
| | | reason, &attributes |
| | | ), |
| | | "runtime helper asr_realtime_metadata_rejected"); |
| | | return; |
| | | } |
| | |
| | | ); |
| | | assert!(upload.is_none()); |
| | | vad.reset_current_turn(); |
| | | attrs.remove("clientFixtureSequence"); |
| | | let (_, _, missing_sequence_turn) = observe_bound_participant_frame( |
| | | "participant-user", |
| | | Some("participant-user"), |
| | | &mut vad, |
| | | "call-001", |
| | | "trace-001", |
| | | "participant-user", |
| | | "track-001", |
| | | 6, |
| | | 6_000, |
| | | &frame, |
| | | Client::new(), |
| | | RealtimeAsrConfig { |
| | | enabled: true, |
| | | url: Some(format!("http://{address}/runtime/asr/realtime")), |
| | | runtime_token: Some("test".to_string()), |
| | | runtime_session_nonce: Some("test".to_string()), |
| | | chunk_duration_ms: 200, |
| | | }, |
| | | || attrs.clone(), |
| | | &mut upload, |
| | | &mut last_fixture_sequence, |
| | | true, |
| | | ); |
| | | assert!(missing_sequence_turn.is_none() && upload.is_none()); |
| | | assert_eq!( |
| | | "sequence_absent", |
| | | AudioIngressMetadata::rejected_origin_status("incomplete_metadata", &attrs) |
| | | ); |
| | | assert_eq!(2, captured_count.load(Ordering::SeqCst)); |
| | | vad.reset_current_turn(); |
| | | attrs.insert("inputSourceCategory".to_string(), "other".to_string()); |
| | | let mut invalid_upload = None; |
| | | let (_, _, invalid_turn) = observe_bound_participant_frame( |