davidstump / SwiftPhoenixClient

Connect your Phoenix and iOS applications through WebSockets!
MIT License
511 stars 147 forks source link

Stopping reconnecting when Socket errors #197

Closed fractal-def closed 3 years ago

fractal-def commented 3 years ago

I may be missing something totally obvious, but I've spent a few hours trying to figure it out to no avail.

Background

I am trying to handle the case when Phoenix rejects the Socket due to an invalid auth token. On the server-side the Phoneix.Socket returns :error.

Issue

I am trying to use the socket.onError or socket.delegateOnError to tell the socket to disconnect. It does disconnect, but the socket immediately tries to reconnect. I cannot figure out how to get it to stop. In my output it does say the socket disconnected, but then it immediately tries to reconnect regardless that I called socket.disconnect()

The Code

I have the following code:

final class MyWebSocket: ObservableObject {
  private var socket: Socket?
  private var channel: Channel?

  func connect(token: String, user_id: String) {
    let socket = Socket("ws://localhost:4000/socket", paramsClosure: { ["token": self.token ?? ""] })
    socket.logger = { value in
      print("WS Log: ", value)
    }
    let channel = socket.channel("users:\(user_id)")

    self.socket = socket
    self.channel = channel
    checkAccessToken = false

    connect()
  }

  func connect() {
    guard let socket = socket,
          let channel = channel
      else {
      return
    }
    socket.delegateOnError(to: self) {
      (self, error) in

      print("Socket Connection Error", error)
      self.checkAccessToken = true
      self.disconnect()
    }

    socket.connect()

    channel.delegateOnError(to: self) { (self, message) in
      if message.event == "phx_error" {
        print("Channel Connection Error \(message.topic) \(message.event) has closed")
        self.checkAccessToken = true
        self.disconnect()
      }
    }

    channel.delegateOnClose(to: self) { (self, message) in
      print("Channel \(message.topic) has closed")
    }

    channel.join()
      .receive("ok") { message in
        print("Channel Joined", message.payload)
      }
      .receive("error") { message in
        print("Failed to join", message.payload)
      }
  }

  func disconnect() {
    channel?.leave()
    socket?.disconnect {
      print("Disconnected from Socket")
    }
    socket?.releaseCallbacks()
    self.socket = nil
    self.channel = nil
  }
}

Debugging Output

WS Log:  SwiftPhoenixClient: transport, Error Domain=NSURLErrorDomain Code=-1011 "There was a bad response from the server." UserInfo={NSErrorFailingURLStringKey=http://localhost:4000/socket/websocket?token=SFMyNTY.g2gDdAAAAANkAAljbGllbnRfaWRtAAAAH3FlU09XRFlvUHI2V3A3cGpCNjlVeWJ3ekdvcW1DNm1kAAJpZG0AAAAkMDhkYTRhZDItMWVhNS00YmE1LWI3MTgtOWJkZTkzMGRiYzdlZAAFdG9rZW5tAAAAIBa3erNS3GCoKOrFhOHVgGpsOSbs_WsU1Lg_tcydSc29bgYAi_qs5HsBYgABUYA.jQpMybJ5PhV_0hSGfT3J2TjUXsfBGRIqkcAVahyF-n4, NSErrorFailingURLKey=http://localhost:4000/socket/websocket?token=SFMyNTY.g2gDdAAAAANkAAljbGllbnRfaWRtAAAAH3FlU09XRFlvUHI2V3A3cGpCNjlVeWJ3ekdvcW1DNm1kAAJpZG0AAAAkMDhkYTRhZDItMWVhNS00YmE1LWI3MTgtOWJkZTkzMGRiYzdlZAAFdG9rZW5tAAAAIBa3erNS3GCoKOrFhOHVgGpsOSbs_WsU1Lg_tcydSc29bgYAi_qs5HsBYgABUYA.jQpMybJ5PhV_0hSGfT3J2TjUXsfBGRIqkcAVahyF-n4, _NSURLErrorWebSocketHandshakeFailureReasonKey=0, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalWebSocketTask <3C1ADCF7-A041-4344-A306-9E1342354322>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <3C1ADCF7-A041-4344-A306-9E1342354322>.<1>, NSLocalizedDescription=There was a bad response from the server.}
WS Log:  SwiftPhoenixClient: channel, error topic: users:df69a489-acc2-4011-829c-48ac23173226 joinRef: 4 mesage: SwiftPhoenixClient.Message
Channel Connection Error users:df69a489-acc2-4011-829c-48ac23173226 phx_error has closed
WS Log:  SwiftPhoenixClient: channel, leave users:df69a489-acc2-4011-829c-48ac23173226
WS Log:  SwiftPhoenixClient: channel, close topic: users:df69a489-acc2-4011-829c-48ac23173226 joinRef: 4
Channel users:df69a489-acc2-4011-829c-48ac23173226 has closed
Disconnected from Socket
Socket Connection Error Error Domain=NSURLErrorDomain Code=-1011 "There was a bad response from the server." UserInfo={NSErrorFailingURLStringKey=http://localhost:4000/socket/websocket?token=SFMyNTY.g2gDdAAAAANkAAljbGllbnRfaWRtAAAAH3FlU09XRFlvUHI2V3A3cGpCNjlVeWJ3ekdvcW1DNm1kAAJpZG0AAAAkMDhkYTRhZDItMWVhNS00YmE1LWI3MTgtOWJkZTkzMGRiYzdlZAAFdG9rZW5tAAAAIBa3erNS3GCoKOrFhOHVgGpsOSbs_WsU1Lg_tcydSc29bgYAi_qs5HsBYgABUYA.jQpMybJ5PhV_0hSGfT3J2TjUXsfBGRIqkcAVahyF-n4, NSErrorFailingURLKey=http://localhost:4000/socket/websocket?token=SFMyNTY.g2gDdAAAAANkAAljbGllbnRfaWRtAAAAH3FlU09XRFlvUHI2V3A3cGpCNjlVeWJ3ekdvcW1DNm1kAAJpZG0AAAAkMDhkYTRhZDItMWVhNS00YmE1LWI3MTgtOWJkZTkzMGRiYzdlZAAFdG9rZW5tAAAAIBa3erNS3GCoKOrFhOHVgGpsOSbs_WsU1Lg_tcydSc29bgYAi_qs5HsBYgABUYA.jQpMybJ5PhV_0hSGfT3J2TjUXsfBGRIqkcAVahyF-n4, _NSURLErrorWebSocketHandshakeFailureReasonKey=0, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalWebSocketTask <3C1ADCF7-A041-4344-A306-9E1342354322>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <3C1ADCF7-A041-4344-A306-9E1342354322>.<1>, NSLocalizedDescription=There was a bad response from the server.}
WS Log:  SwiftPhoenixClient: transport, close
WS Log:  SwiftPhoenixClient: Socket reconnecting in 0.01s
WS Log:  SwiftPhoenixClient: transport, Error Domain=NSURLErrorDomain Code=-1011 "There was a bad response from the server." UserInfo={NSErrorFailingURLStringKey=http://localhost:4000/socket/websocket?token=SFMyNTY.g2gDdAAAAANkAAljbGllbnRfaWRtAAAAH3FlU09XRFlvUHI2V3A3cGpCNjlVeWJ3ekdvcW1DNm1kAAJpZG0AAAAkMDhkYTRhZDItMWVhNS00YmE1LWI3MTgtOWJkZTkzMGRiYzdlZAAFdG9rZW5tAAAAIBa3erNS3GCoKOrFhOHVgGpsOSbs_WsU1Lg_tcydSc29bgYAi_qs5HsBYgABUYA.jQpMybJ5PhV_0hSGfT3J2TjUXsfBGRIqkcAVahyF-n4, NSErrorFailingURLKey=http://localhost:4000/socket/websocket?token=SFMyNTY.g2gDdAAAAANkAAljbGllbnRfaWRtAAAAH3FlU09XRFlvUHI2V3A3cGpCNjlVeWJ3ekdvcW1DNm1kAAJpZG0AAAAkMDhkYTRhZDItMWVhNS00YmE1LWI3MTgtOWJkZTkzMGRiYzdlZAAFdG9rZW5tAAAAIBa3erNS3GCoKOrFhOHVgGpsOSbs_WsU1Lg_tcydSc29bgYAi_qs5HsBYgABUYA.jQpMybJ5PhV_0hSGfT3J2TjUXsfBGRIqkcAVahyF-n4, _NSURLErrorWebSocketHandshakeFailureReasonKey=4294967296, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalWebSocketTask <B91C86BA-0AD9-4DB7-8B24-A5091107D29B>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <B91C86BA-0AD9-4DB7-8B24-A5091107D29B>.<1>, NSLocalizedDescription=There was a bad response from the server.}
WS Log:  SwiftPhoenixClient: channel, error topic: users:df69a489-acc2-4011-829c-48ac23173226 joinRef: 4 mesage: SwiftPhoenixClient.Message
Channel Connection Error users:df69a489-acc2-4011-829c-48ac23173226 phx_error has closed
WS Log:  SwiftPhoenixClient: channel, leave users:df69a489-acc2-4011-829c-48ac23173226
WS Log:  SwiftPhoenixClient: channel, close topic: users:df69a489-acc2-4011-829c-48ac23173226 joinRef: nil
Channel users:df69a489-acc2-4011-829c-48ac23173226 has closed
Disconnected from Socket

[... repeats forever ...]
fukemy commented 1 year ago

hi how did u solved this?

dsrees commented 1 year ago

Calling socket.disconnect as a result of socket.onError should work. If you're able to push a demo project and server that reproduces this then I can look further into it