@@ -660,7 +660,7 @@ func (backend *Backend) createAndAddAccount(coin coinpkg.Coin, persistedConfig *
660660 type data struct {
661661 Type string `json:"typ"`
662662 KeystoreName string `json:"keystoreName"`
663- ErrorCode string `json:"errorCode"`
663+ ErrorCode string `json:"errorCode,omitempty "`
664664 ErrorMessage string `json:"errorMessage"`
665665 }
666666 accountRootFingerprint , err := persistedConfig .SigningConfigurations .RootFingerprint ()
@@ -672,45 +672,81 @@ func (backend *Backend) createAndAddAccount(coin coinpkg.Coin, persistedConfig *
672672 if err == nil {
673673 keystoreName = persistedKeystore .Name
674674 }
675- backend .Notify (observable.Event {
676- Subject : "connect-keystore" ,
677- Action : action .Replace ,
678- Object : data {
679- Type : "connect" ,
680- KeystoreName : keystoreName ,
681- },
682- })
683- ks , err := backend .connectKeystore .connect (
684- backend .Keystore (),
685- accountRootFingerprint ,
686- 20 * time .Minute ,
687- )
675+ var ks keystore.Keystore
676+ timeout := 20 * time .Minute
677+ outerLoop:
678+ for {
679+ backend .Notify (observable.Event {
680+ Subject : "connect-keystore" ,
681+ Action : action .Replace ,
682+ Object : data {
683+ Type : "connect" ,
684+ KeystoreName : keystoreName ,
685+ },
686+ })
687+ ks , err = backend .connectKeystore .connect (
688+ backend .Keystore (),
689+ accountRootFingerprint ,
690+ timeout ,
691+ )
692+ if err == nil || errp .Cause (err ) != ErrWrongKeystore {
693+ break
694+ } else {
695+ backend .Notify (observable.Event {
696+ Subject : "connect-keystore" ,
697+ Action : action .Replace ,
698+ Object : data {
699+ Type : "error" ,
700+ ErrorCode : err .Error (),
701+ ErrorMessage : "" ,
702+ },
703+ })
704+ c := make (chan bool )
705+ // retryCallback is called when the current keystore is deregistered or when
706+ // CancelConnectKeystore() is called.
707+ // In the first case it allows to make a new connection attempt, in the last one
708+ // it'll make this function return ErrUserAbort.
709+ backend .connectKeystore .SetRetryConnect (func (retry bool ) {
710+ c <- retry
711+ })
712+ select {
713+ case retry := <- c :
714+ if ! retry {
715+ err = errp .ErrUserAbort
716+ break outerLoop
717+ }
718+ case <- time .After (timeout ):
719+ backend .connectKeystore .SetRetryConnect (nil )
720+ err = errTimeout
721+ break outerLoop
722+ }
723+ }
724+ }
688725 switch {
689726 case errp .Cause (err ) == errReplaced :
690727 // If a previous connect-keystore request is in progress, the previous request is
691728 // failed, but we don't dismiss the prompt, as the new prompt has already been shown
692- // by the above "connect" notification.y
693- case err == nil || errp .Cause (err ) == errUserAbort :
729+ // by the above "connect" notification.
730+ case err == nil || errp .Cause (err ) == errp . ErrUserAbort :
694731 // Dismiss prompt after success or upon user abort.
695-
696732 backend .Notify (observable.Event {
697733 Subject : "connect-keystore" ,
698734 Action : action .Replace ,
699735 Object : nil ,
700736 })
701737 default :
702- // Display error to user.
703- errorCode := ""
704- if errp .Cause (err ) == ErrWrongKeystore {
705- errorCode = "wrongKeystore"
738+ var errorCode = ""
739+ if errp .Cause (err ) == errTimeout {
740+ errorCode = err .Error ()
706741 }
742+ // Display error to user.
707743 backend .Notify (observable.Event {
708744 Subject : "connect-keystore" ,
709745 Action : action .Replace ,
710746 Object : data {
711747 Type : "error" ,
712- ErrorCode : errorCode ,
713748 ErrorMessage : err .Error (),
749+ ErrorCode : errorCode ,
714750 },
715751 })
716752 }
0 commit comments