vapor/http

Working with async functions

grahamburgsma opened this issue · 3 comments

Since the rest of Vapor is very asynchronous with many tasks returning futures, it makes it difficult to work with web sockets. Maybe this just requires more examples in the documentation, though it would be nice if web sockets got some love like the rest of Vapor.

If you need to do a query in one of the following examples, there is no where to return the future. I've run in to leaking promises and other issues because of this.

func onUpgrade(ws: WebSocket, req: Request) throws
ws.onText { (ws, text) in
    // no where to return future
}

Could this get addressed in Vapor 4?

This could be possible, if we can figure out a sensible way for the closure to handle a failed future. Something like logging the error then closing the WebSocket?

I'm not sure how useful that would be though since one would probably want better error handling logic for their client's sake. Which you can do currently with something like:

ws.onText { (ws, text) in
    someAsyncThing().do { res in
        ws.send("res is: \(res")
    }.catch { error in
        ws.send("oops: \(error)")
        ws.close()
    }
}

I think a WebSocket.onError handler would be nice:

ws.onError( (ws, error) in
    logger.error(error.localizedDescription)
    ws.close()
}

I like @calebkleveter's idea, though don't know if that would be possible. Plus we already have WebSocket.onError and it's used for when the connection itself has an error.

But one place to handle errors from futures, or maybe an error middleware for web sockets would be nice.