Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reject promise in middleware #111

Closed
wideving opened this issue Nov 5, 2018 · 5 comments
Closed

Reject promise in middleware #111

wideving opened this issue Nov 5, 2018 · 5 comments

Comments

@wideving
Copy link

wideving commented Nov 5, 2018

I'm doing authentication in middleware and when authentication fails I want to reject the promise with a custom error object. Where do I catch this error object? I have added validate(), done(), fail() and always handlers but none of them seem to be called. Have I misunderstood how reject works?

@wideving
Copy link
Author

wideving commented Nov 5, 2018

I will add an example of what I try to do

fun getAuth() {
    networking.request(.getAuth)
    .validate()
    .done { response in
      //None of these handlers gets called
    }
    .fail { error in
        
    }
    .always { result in 
      
    }
}

networking.middleware = { promise in 
  promise.reject(NetworkError(code: 999, message: "error..")
}

@vadymmarkov
Copy link
Owner

Hi @wideving! I don't think it's a problem with reject itself, there's probably something else. Do you keep a reference to your Networking instance so it's not deallocated?

@wideving
Copy link
Author

wideving commented Nov 7, 2018

Hello @vadymmarkov, thank you for a quick response 👍 I don't think there is a problem with deallocation since the request goes through if I resolve instead of reject. I have no problem with your library other then when i reject in middleware nothing happens. All other requests and functionality is working fine.

Here is the code for how i create an instance of networking, its stored as a reference in appdelegate. The networking object is then injected to a viewmodel and called from there

`
func createApi(unrestrictedApi: Networking,
session: Session) -> Networking {

let api = Networking<RestrictedApi>()
api.middleware = { promise in
  if !session.shouldRefreshToken {
    api.authenticate(authorizationHeader: session.authorizationToken)
    promise.resolve(Void())
    return
  }
  
  unrestrictedApi.request(.refresh(phoneNumber: session.phoneNumber))
    .validate()
    .toData()
    .then({response -> String in
      return try JSONDecoder().decode(Authorization.self, from: response).token
    })
    .done({ token in
      guard
        let decryptedToken = CipherUtility.decrypt(encryptedString: token)
      else {
        promise.reject(NetworkError.noDataInResponse)
        return
      }
      
      session.setAuthorizationToken(token: decryptedToken)
      api.authenticate(authorizationHeader: session.authorizationToken)
      promise.resolve(Void())
    })
    .fail({ error in
      let message = NetworkErrorParser.parse(error: error)
      print("error message: \(message)")
      promise.reject(NetworkError.noDataInResponse)
    })
  }

return api

}
`

UnrestrictedApi and RestrictedApi is stored like this in appdelegate
private let unrestrictedApi = Networking<UnrestrictedApi>() private lazy var restrictedApi: Networking<RestrictedApi> = { ApiGenerator().createApi(unrestrictedApi: unrestrictedApi, session: UserAccountSession()) }()

Do you spot anything weird?

@vadymmarkov
Copy link
Owner

@wideving You're right, I found a bug in implementation with promise not being rejected when middleware fails. It should be fixed in #112. Please test it on master branch and if it works as expected I'll make a new release.

@wideving
Copy link
Author

wideving commented Nov 8, 2018

I did a pod update with pod 'Malibu', :git => 'https://github.com/vadymmarkov/Malibu.git', :commit => 'b2afba1' to confirm that issue is solved and everything now works as expected with rejections coming through middleware. Thank you.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants