Luis K
Luis K

Reputation: 21

Vapor 3 Websocket with Sessions

In Vapor 2 it was possible to access a session when connecting a new websocket.

For example:

setupRoutes(){

  socket("ws") { request, websocket in
    let session = try request.assertSession()
    guard let userId = session.data["user_id"]?.string else {
      ..
    }
}

In Vapor 3 configure.swift:

let wss = NIOWebSocketServer.default()
  wss.get("ws") { websocket, request in

    --get session information--

    websocket.onText { websocket, text in
      websocket.send(text)
    }
 }
 services.register(wss, as: WebSocketServer.self)

With Vapor 3 the SessionMiddleware will not be invoked before passing the HTTP upgrade request to the WebsocketServer. So how can I access session information?

Upvotes: 2

Views: 779

Answers (1)

Christopher Thiebaut
Christopher Thiebaut

Reputation: 439

So, I'm super aware that this thread is old and the OP probably found an answer or gave up months ago. Just in case anyone comes across this still looking, can't you use websocket.session to access the session?

This would make the Vapor 3 code

let wss = NIOWebSocketServer.default()
  wss.get("ws") { websocket, request in

    guard let userID = (try? websocket.session).data["user_id"]?.string else {
        ...
    }

    websocket.onText { websocket, text in
      websocket.send(text)
    }
 }
 services.register(wss, as: WebSocketServer.self)

Upvotes: 2

Related Questions