@@ -403,20 +403,35 @@ impl<Trans: Transport + Clone> User<Trans> {
403403 /// * `msg` - Binary message of unknown type
404404 /// * `pk` - Optional ed25519 Public Key of the sending participant. None if unknown
405405 pub fn handle_message ( & mut self , mut msg0 : Message ) -> Result < UnwrappedMessage > {
406+ let mut sequenced = false ;
406407 loop {
407408 // Forget TangleMessage and timestamp
408409 let msg = msg0. binary ;
409410 let preparsed = msg. parse_header ( ) ?;
411+ let link = preparsed. header . link . clone ( ) ;
410412 match preparsed. header . content_type {
411413 message:: SIGNED_PACKET => {
412- let m = self . user . handle_signed_packet ( msg, MsgInfo :: SignedPacket ) ?;
413- let u = m. map ( |( pk, public, masked) | MessageContent :: new_signed_packet ( pk, public, masked) ) ;
414- return Ok ( u) ;
414+ match self . user . handle_signed_packet ( msg, MsgInfo :: SignedPacket ) {
415+ Ok ( m) =>
416+ return Ok ( m. map ( |( pk, public, masked) | MessageContent :: new_signed_packet ( pk, public, masked) ) ) ,
417+ Err ( e) => {
418+ match sequenced {
419+ true => return Ok ( UnwrappedMessage :: new ( link, MessageContent :: unreadable ( ) ) ) ,
420+ false => return Err ( e)
421+ }
422+ }
423+ }
415424 }
416425 message:: TAGGED_PACKET => {
417- let m = self . user . handle_tagged_packet ( msg, MsgInfo :: TaggedPacket ) ?;
418- let u = m. map ( |( public, masked) | MessageContent :: new_tagged_packet ( public, masked) ) ;
419- return Ok ( u) ;
426+ match self . user . handle_tagged_packet ( msg, MsgInfo :: TaggedPacket ) {
427+ Ok ( m) => return Ok ( m. map ( |( public, masked) | MessageContent :: new_tagged_packet ( public, masked) ) ) ,
428+ Err ( e) => {
429+ match sequenced {
430+ true => return Ok ( UnwrappedMessage :: new ( link, MessageContent :: unreadable ( ) ) ) ,
431+ false => return Err ( e)
432+ }
433+ }
434+ }
420435 }
421436 message:: KEYLOAD => {
422437 // So long as the unwrap has not failed, we will return a blank object to
@@ -436,6 +451,7 @@ impl<Trans: Transport + Clone> User<Trans> {
436451 ) ;
437452 let msg = self . transport . recv_message ( & msg_link) ?;
438453 self . user . store_state ( unwrapped. body . pk , store_link) ?;
454+ sequenced = true ;
439455 msg0 = msg;
440456 }
441457 unknown_content => return err ! ( UnknownMsgType ( unknown_content) ) ,
@@ -693,20 +709,35 @@ impl<Trans: Transport + Clone> User<Trans> {
693709 /// # Arguments
694710 /// * `msg` - Binary message of unknown type
695711 pub async fn handle_message ( & mut self , mut msg0 : Message ) -> Result < UnwrappedMessage > {
712+ let mut sequenced = false ;
696713 loop {
697714 // Forget TangleMessage and timestamp
698715 let msg = msg0. binary ;
699716 let preparsed = msg. parse_header ( ) ?;
717+ let link = preparsed. header . link . clone ( ) ;
700718 match preparsed. header . content_type {
701719 message:: SIGNED_PACKET => {
702- let m = self . user . handle_signed_packet ( msg, MsgInfo :: SignedPacket ) ?;
703- let u = m. map ( |( pk, public, masked) | MessageContent :: new_signed_packet ( pk, public, masked) ) ;
704- return Ok ( u) ;
720+ match self . user . handle_signed_packet ( msg, MsgInfo :: SignedPacket ) {
721+ Ok ( m) =>
722+ return Ok ( m. map ( |( pk, public, masked) | MessageContent :: new_signed_packet ( pk, public, masked) ) ) ,
723+ Err ( e) => {
724+ match sequenced {
725+ true => return Ok ( UnwrappedMessage :: new ( link, MessageContent :: unreadable ( ) ) ) ,
726+ false => return Err ( e)
727+ }
728+ }
729+ }
705730 }
706731 message:: TAGGED_PACKET => {
707- let m = self . user . handle_tagged_packet ( msg, MsgInfo :: TaggedPacket ) ?;
708- let u = m. map ( |( public, masked) | MessageContent :: new_tagged_packet ( public, masked) ) ;
709- return Ok ( u) ;
732+ match self . user . handle_tagged_packet ( msg, MsgInfo :: TaggedPacket ) {
733+ Ok ( m) => return Ok ( m. map ( |( public, masked) | MessageContent :: new_tagged_packet ( public, masked) ) ) ,
734+ Err ( e) => {
735+ match sequenced {
736+ true => return Ok ( UnwrappedMessage :: new ( link, MessageContent :: unreadable ( ) ) ) ,
737+ false => return Err ( e)
738+ }
739+ }
740+ }
710741 }
711742 message:: KEYLOAD => {
712743 // So long as the unwrap has not failed, we will return a blank object to
@@ -726,6 +757,7 @@ impl<Trans: Transport + Clone> User<Trans> {
726757 ) ;
727758 let msg = self . transport . recv_message ( & msg_link) . await ?;
728759 self . user . store_state ( unwrapped. body . pk , store_link) ?;
760+ sequenced = true ;
729761 msg0 = msg;
730762 }
731763 unknown_content => return err ! ( UnknownMsgType ( unknown_content) ) ,
0 commit comments