@ -64,7 +64,7 @@ public enum MessageSendJob: JobExecutor {
// I f t h e o r i g i n a l i n t e r a c t i o n n o l o n g e r e x i s t s t h e n d o n ' t b o t h e r s e n d i n g t h e m e s s a g e ( i e . t h e
// m e s s a g e w a s d e l e t e d b e f o r e i t e v e n g o t s e n t )
guard try Interaction . exists ( db , id : interactionId ) else {
Log . warn ( . cat , " Failing (\( job . id ? ? - 1 ) ) due to missing interaction " )
Log . warn ( . cat , " Failing \( messageType ) (\( job . id ? ? - 1 ) ) due to missing interaction " )
return ( StorageError . objectNotFound , [ ] , [ ] )
}
@ -80,7 +80,7 @@ public enum MessageSendJob: JobExecutor {
// I f t h e r e w e r e f a i l e d a t t a c h m e n t s t h e n t h i s j o b s h o u l d f a i l ( c a n ' t s e n d a
// m e s s a g e w h i c h h a s a s s o c i a t e d a t t a c h m e n t s i f t h e a t t a c h m e n t s f a i l t o u p l o a d )
guard ! allAttachmentStateInfo . contains ( where : { $0 . state = = . failedDownload } ) else {
Log . info ( . cat , " Failing (\( job . id ? ? - 1 ) ) due to failed attachment upload " )
Log . info ( . cat , " Failing \( messageType ) (\( job . id ? ? - 1 ) ) due to failed attachment upload " )
return ( AttachmentError . notUploaded , [ ] , fileIds )
}
@ -114,7 +114,7 @@ public enum MessageSendJob: JobExecutor {
// / I f w e g o t a n e r r o r w h e n t r y i n g t o r e t r i e v e t h e a t t a c h m e n t s t a t e t h e n t h i s j o b i s a c t u a l l y i n v a l i d s o i t
// / s h o u l d p e r m a n e n t l y f a i l
guard attachmentState . error = = nil else {
Log . error ( . cat , " Failed due to invalid attachment state" )
Log . error ( . cat , " Failed \( messageType ) ( \( job . id ? ? - 1 ) ) due to invalid attachment state" )
return failure ( job , ( attachmentState . error ? ? MessageSenderError . invalidMessage ) , true )
}
@ -160,7 +160,7 @@ public enum MessageSendJob: JobExecutor {
}
}
Log . info ( . cat , " Deferring (\( job . id ? ? - 1 ) ) due to pending attachment uploads " )
Log . info ( . cat , " Deferring \( messageType ) (\( job . id ? ? - 1 ) ) due to pending attachment uploads " )
return deferred ( job )
}
@ -168,6 +168,44 @@ public enum MessageSendJob: JobExecutor {
messageFileIds = attachmentState . preparedFileIds
}
// / I f t h i s m e s s a g e i s b e i n g s e n t t o a n u p d a t e d g r o u p t h e n w e s h o u l d f i r s t m a k e s u r e t h a t w e h a v e a e n c r y p t i o n k e y s
// / f o r t h e g r o u p b e f o r e w e t r y t o s e n d t h e m e s s a g e , i f n o t t h e n d e f e r t h e j o b 1 s e c o n d t o g i v e t h e p o l l e r t h e c h a n c e t o
// / r e c e i v e t h e k e y s
// /
// / * * N o t e : * * I f w e h a v e a l r e a d y d e f e r r e d t h i s m e s s a g e o n c e t h e n w e s h o u l d o n l y c o n t i n u e t o d e f e r i f w e h a v e a c o n f i g
// / f o r t h e m e s s a g e ( t h i s w a y w e w o n ' t g e t s t u c k d e f e r r i n g p e r m a n e n t l y i f c o n f i g s t a t e i s n ' t l o a d e d a n d w e w i l l i n s t e a d t r y ,
// / a n d f a i l , t o s e n d t h e m e s s a g e )
var previousDeferralsMessage : String = " "
switch details . destination {
case . closedGroup ( let groupPublicKey ) where groupPublicKey . starts ( with : SessionId . Prefix . group . rawValue ) :
let deferalDuration : TimeInterval = 1
let groupSessionId : SessionId = SessionId ( . group , hex : groupPublicKey )
let numGroupKeys : Int = ( try ? LibSession . numKeys ( groupSessionId : groupSessionId , using : dependencies ) )
. defaulting ( to : 0 )
let deferCount : Int = dependencies [ singleton : . jobRunner ] . deferCount ( for : job . id , of : job . variant )
previousDeferralsMessage = " and \( . seconds ( Double ( deferCount ) * deferalDuration ) , unit : . s ) of deferrals " // s t r i n g l i n t : i g n o r e
guard
numGroupKeys > 0 && (
deferCount = = 0 ||
dependencies [ cache : . libSession ] . hasConfig ( for : . groupKeys , sessionId : groupSessionId )
)
else {
// D e f e r t h e j o b b y 1 s t o g i v e i t a l i t t l e m o r e t i m e t o r e c e i v e u p d a t e d k e y s
let updatedJob : Job ? = dependencies [ singleton : . storage ] . write { db in
try job
. with ( nextRunTimestamp : dependencies . dateNow . timeIntervalSince1970 + deferalDuration )
. upserted ( db )
}
Log . info ( . cat , " Deferring \( messageType ) ( \( job . id ? ? - 1 ) ) as we haven't received the group encryption keys yet " )
return deferred ( updatedJob ? ? job )
}
default : break
}
// S t o r e t h e s e n t T i m e s t a m p f r o m t h e m e s s a g e i n c a s e i t f a i l s d u e t o a c l o c k O u t O f S y n c e r r o r
let originalSentTimestampMs : UInt64 ? = details . message . sentTimestampMs
let startTime : TimeInterval = dependencies . dateNow . timeIntervalSince1970
@ -196,11 +234,11 @@ public enum MessageSendJob: JobExecutor {
receiveCompletion : { result in
switch result {
case . finished :
Log . info ( . cat , " Completed sending \( messageType ) ( \( job . id ? ? - 1 ) ) after \( . seconds ( dependencies . dateNow . timeIntervalSince1970 - startTime ) , unit : . s ) . " )
Log . info ( . cat , " Completed sending \( messageType ) ( \( job . id ? ? - 1 ) ) after \( . seconds ( dependencies . dateNow . timeIntervalSince1970 - startTime ) , unit : . s ) \( previousDeferralsMessage ) . " )
success ( job , false )
case . failure ( let error ) :
Log . info ( . cat , " Failed to send \( messageType ) ( \( job . id ? ? - 1 ) ) after \( . seconds ( dependencies . dateNow . timeIntervalSince1970 - startTime ) , unit : . s ) due to error: \( error ) . " )
Log . info ( . cat , " Failed to send \( messageType ) ( \( job . id ? ? - 1 ) ) after \( . seconds ( dependencies . dateNow . timeIntervalSince1970 - startTime ) , unit : . s ) \( previousDeferralsMessage ) due to error: \( error ) . " )
// A c t u a l e r r o r h a n d l i n g
switch ( error , details . message ) {