Need help connecting iPhone app to rasa socketIO channel

Hi everyone,

I’m coding an iPhone app in swift and want to integrate rasa. I installed rasa x with the one line script in a docker container on GCP. I can access the UI through my browser via http and https. Previously I tried to communicate with the rasa instance using the rest input channel with no success. Then I discovered that I could use websockets, which seems more useful anyway.

I created a test html file on my desktop and pasted in the script snippet to use webchat and apart from the fact that rasa always starts the conversation with ‘bye’ the communication works.

Now on to getting it to work for my app. I installed socketIO for my swift project, as rasa has a default socketIO channel (had to enable that to get my local html page to work) and the webchat widget is based off of socketIO. I created a new one page app to test it and this is my view controller:

View Controller Code
import UIKit
import SocketIO

class ViewController: UIViewController {

    @IBOutlet var button: UIView!
    let manager = SocketManager(socketURL: URL(string: "https://chat.epifunnyedu.com")!,config: [.log(true)])

    var socket:SocketIOClient!

    override func viewDidLoad() {
        super.viewDidLoad()
        self.socket = manager.defaultSocket
        self.setSocketEvents()
        
        self.socket.connect()
    }
    
    private func setSocketEvents() {
        self.socket.on(clientEvent: .connect) {
            data, ack in print("socket connected")
            
        }
    }
    @IBAction func press_button(_ sender: Any) {
        self.socket.emitWithAck("session_request").timingOut(after: 5) {data in
            print(data)
        }
        
    }
}

I created a button in the main storyboard that sends a “session_request”

This is the console output apon running the app:
2020-05-04 21:37:24.926024+0200 sockettest[49264:31477738] LOG SocketIOClient{/}: Adding handler for event: connect
2020-05-04 21:37:24.926414+0200 sockettest[49264:31477738] LOG SocketIOClient{/}: Handling event: statusChange with data: [connecting, 2]
2020-05-04 21:37:24.926557+0200 sockettest[49264:31477738] LOG SocketIOClient{/}: Joining namespace /
2020-05-04 21:37:24.926651+0200 sockettest[49264:31477738] LOG SocketManager: Tried connecting socket when engine isn't open. Connecting
2020-05-04 21:37:24.926781+0200 sockettest[49264:31477738] LOG SocketManager: Adding engine
2020-05-04 21:37:24.929457+0200 sockettest[49264:31477840] LOG SocketEngine: Starting engine. Server: https://rasa.mydomain.com
2020-05-04 21:37:24.929664+0200 sockettest[49264:31477840] LOG SocketEngine: Handshaking
2020-05-04 21:37:24.932520+0200 sockettest[49264:31477840] LOG SocketEnginePolling: Doing polling GET https://rasa.mydomain.com/socket.io/?transport=polling&b64=1
2020-05-04 21:37:25.876930+0200 sockettest[49264:31477839] Received XPC error Connection interrupted for message type 3 kCFNetworkAgentXPCMessageTypePACQuery
2020-05-04 21:37:25.877178+0200 sockettest[49264:31477839] Received XPC error Connection invalid for message type 3 kCFNetworkAgentXPCMessageTypePACQuery
2020-05-04 21:37:25.877443+0200 sockettest[49264:31477839] PAC result block not invoked
2020-05-04 21:37:25.877982+0200 sockettest[49264:31477839] [] nw_proxy_resolver_create_parsed_array [C1 proxy pac] Evaluation error: kCFErrorDomainCFNetwork: 308
2020-05-04 21:37:26.652930+0200 sockettest[49264:31477938] LOG SocketEnginePolling: Got polling response
2020-05-04 21:37:26.653141+0200 sockettest[49264:31477938] LOG SocketEnginePolling: Got poll message: 109:0{"sid":"7515085317bd4292920d5efc0bcc2928","upgrades":["websocket"],"pingTimeout":60000,"pingInterval":25000}2:40
2020-05-04 21:37:26.653872+0200 sockettest[49264:31477938] LOG SocketEngine: Got message: 0{"sid":"7515085317bd4292920d5efc0bcc2928","upgrades":["websocket"],"pingTimeout":60000,"pingInterval":25000}
2020-05-04 21:37:26.668566+0200 sockettest[49264:31477738] LOG SocketIOClient{/}: Handling event: ping with data: []
2020-05-04 21:37:26.668574+0200 sockettest[49264:31477938] LOG SocketEngine: Got message: 40
2020-05-04 21:37:26.668916+0200 sockettest[49264:31477738] LOG SocketManager: Engine opened Connect
2020-05-04 21:37:26.669042+0200 sockettest[49264:31477738] LOG SocketIOClient{/}: Socket connected
2020-05-04 21:37:26.669205+0200 sockettest[49264:31477738] LOG SocketIOClient{/}: Handling event: statusChange with data: [connected, 3]
2020-05-04 21:37:26.669384+0200 sockettest[49264:31477738] LOG SocketIOClient{/}: Handling event: connect with data: ["/"]
socket connected
2020-05-04 21:37:26.669740+0200 sockettest[49264:31477738] LOG SocketParser: Parsing 0
2020-05-04 21:37:26.669813+0200 sockettest[49264:31477938] LOG SocketEnginePolling: Doing polling GET https://rasa.mydomain.com/socket.io/?transport=polling&b64=1&sid=7515085317bd4292920d5efc0bcc2928
2020-05-04 21:37:26.669940+0200 sockettest[49264:31477738] LOG SocketParser: Decoded packet as: SocketPacket {type: 0; data: []; id: -1; placeholders: 0; nsp: /}
2020-05-04 21:37:26.670852+0200 sockettest[49264:31477938] LOG SocketEngine: Writing poll:  has data: false
2020-05-04 21:37:26.672241+0200 sockettest[49264:31477938] LOG SocketEnginePolling: Sending poll:  as type: 2
2020-05-04 21:37:26.672682+0200 sockettest[49264:31477938] LOG SocketEnginePolling: Created POST string: 1:2
2020-05-04 21:37:26.673209+0200 sockettest[49264:31477938] LOG SocketEnginePolling: POSTing
2020-05-04 21:37:26.673607+0200 sockettest[49264:31477938] LOG SocketEnginePolling: Doing polling POST https://rasa.mydomain.com/socket.io/?transport=polling&b64=1&sid=7515085317bd4292920d5efc0bcc2928
2020-05-04 21:37:27.284300+0200 sockettest[49264:31477864] LOG SocketEnginePolling: Got polling response
2020-05-04 21:37:27.284524+0200 sockettest[49264:31477864] LOG SocketEnginePolling: Got poll message: 1:3
2020-05-04 21:37:27.284778+0200 sockettest[49264:31477864] LOG SocketEngine: Got message: 3
2020-05-04 21:37:27.285002+0200 sockettest[49264:31477738] LOG SocketIOClient{/}: Handling event: pong with data: []
2020-05-04 21:37:27.285112+0200 sockettest[49264:31477864] LOG SocketEnginePolling: Doing polling GET https://rasa.mydomain.com/socket.io/?transport=polling&b64=1&sid=7515085317bd4292920d5efc0bcc2928
2020-05-04 21:37:27.443801+0200 sockettest[49264:31477864] LOG SocketEngineWebSocket: Sending ws: probe as type: 2
2020-05-04 21:37:27.443818+0200 sockettest[49264:31477738] LOG SocketIOClient{/}: Handling event: websocketUpgrade with data: [["cf-ray": "58e4ad271b3205cc-FRA", "upgrade": "websocket", "sec-websocket-accept": "LBnMQYzwG80YW0SBDsGY5WSEAQs=", "cf-cache-status": "DYNAMIC", "connection": "upgrade", "date": "Mon, 04 May 2020 19", "server": "cloudflare", "cf-request-id": "0282ca8c71000005cc0aa74200000001", "expect-ct": "max-age=604800, report-uri=\"https"]]
2020-05-04 21:37:27.619087+0200 sockettest[49264:31477864] LOG SocketEnginePolling: Got polling response
2020-05-04 21:37:27.619246+0200 sockettest[49264:31477864] LOG SocketEnginePolling: Got poll message: 1:6
2020-05-04 21:37:27.619370+0200 sockettest[49264:31477864] LOG SocketEngine: Got message: 6
2020-05-04 21:37:27.619564+0200 sockettest[49264:31477864] LOG SocketEnginePolling: Doing polling GET https://rasa.mydomain.com/socket.io/?transport=polling&b64=1&sid=7515085317bd4292920d5efc0bcc2928
2020-05-04 21:37:27.623908+0200 sockettest[49264:31477864] LOG SocketEngine: Got message: 3probe
2020-05-04 21:37:27.624925+0200 sockettest[49264:31477864] LOG SocketEngine: Received probe response, should upgrade to WebSockets
2020-05-04 21:37:27.625802+0200 sockettest[49264:31477864] LOG SocketEngine: Upgrading transport to WebSockets
2020-05-04 21:37:27.626512+0200 sockettest[49264:31477864] LOG SocketEnginePolling: Sending poll:  as type: 6
2020-05-04 21:37:27.627418+0200 sockettest[49264:31477864] LOG SocketEnginePolling: Created POST string: 1:6
2020-05-04 21:37:27.629313+0200 sockettest[49264:31477864] LOG SocketEnginePolling: POSTing
2020-05-04 21:37:27.630125+0200 sockettest[49264:31477738] LOG SocketIOClient{/}: Handling event: pong with data: []
And this is the additional output when I press the button in the app:
2020-05-04 21:37:27.285112+0200 sockettest[49264:31477864] LOG SocketEnginePolling: Doing polling GET https://rasa.mydomain.com/socket.io/?transport=polling&b64=1&sid=7515085317bd4292920d5efc0bcc2928
2020-05-04 21:37:27.443801+0200 sockettest[49264:31477864] LOG SocketEngineWebSocket: Sending ws: probe as type: 2
2020-05-04 21:37:27.443818+0200 sockettest[49264:31477738] LOG SocketIOClient{/}: Handling event: websocketUpgrade with data: [["cf-ray": "58e4ad271b3205cc-FRA", "upgrade": "websocket", "sec-websocket-accept": "LBnMQYzwG80YW0SBDsGY5WSEAQs=", "cf-cache-status": "DYNAMIC", "connection": "upgrade", "date": "Mon, 04 May 2020 19", "server": "cloudflare", "cf-request-id": "0282ca8c71000005cc0aa74200000001", "expect-ct": "max-age=604800, report-uri=\"https"]]
2020-05-04 21:37:27.619087+0200 sockettest[49264:31477864] LOG SocketEnginePolling: Got polling response
2020-05-04 21:37:27.619246+0200 sockettest[49264:31477864] LOG SocketEnginePolling: Got poll message: 1:6
2020-05-04 21:37:27.619370+0200 sockettest[49264:31477864] LOG SocketEngine: Got message: 6
2020-05-04 21:37:27.619564+0200 sockettest[49264:31477864] LOG SocketEnginePolling: Doing polling GET https://rasa.mydomain.com/socket.io/?transport=polling&b64=1&sid=7515085317bd4292920d5efc0bcc2928
2020-05-04 21:37:27.623908+0200 sockettest[49264:31477864] LOG SocketEngine: Got message: 3probe
2020-05-04 21:37:27.624925+0200 sockettest[49264:31477864] LOG SocketEngine: Received probe response, should upgrade to WebSockets
2020-05-04 21:37:27.625802+0200 sockettest[49264:31477864] LOG SocketEngine: Upgrading transport to WebSockets
2020-05-04 21:37:27.626512+0200 sockettest[49264:31477864] LOG SocketEnginePolling: Sending poll:  as type: 6
2020-05-04 21:37:27.627418+0200 sockettest[49264:31477864] LOG SocketEnginePolling: Created POST string: 1:6
2020-05-04 21:37:27.629313+0200 sockettest[49264:31477864] LOG SocketEnginePolling: POSTing
2020-05-04 21:37:27.630125+0200 sockettest[49264:31477738] LOG SocketIOClient{/}: Handling event: pong with data: []
2020-05-04 21:37:37.523549+0200 sockettest[49264:31477738] LOG SocketIOClient{/}: Emitting: 20["session_request"], Ack: false
["NO ACK"]
2020-05-04 21:37:42.525441+0200 sockettest[49264:31477738] LOG OnAckCallback: OnAckCallback for 0 being released

Would be really cool, if anyone could help me with this or show me a different way of making my app talk to rasa. Frankly, I don’t really care how to connected it I just want it to work, so let me know about different recommendations.

Thanks for the help!

Hi @noran. I don’t know much about getting an iOS app to work with socketIO; however, I find it odd that your REST input channel is not working, which might be another option for your swift project. Just want to make sure you did this and then tried sending it a cURL request like this?

Hey @tyd it didn’t fix anything. But your suggestion made me check all my files again and I didn’t have the rest input channel enabled in my credentials.yml so I corrected it. Now, the rest input channel is working, more on that in this thread.

I would still be very interested to get websockets to work as well. Thanks for the help tho