Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Support websocket handlers on dynamic endpoints #15

@danneu

Description

@danneu

Right now, returning Response.websocket("/foo/bar", wshandler) from a handler will add the "/foo/bar" -> wshandler mapping to Jetty's context mappings, so it must be a static path.

So, to mount a websocket handler on /users/<name>, you must do something like this:

val router = Router {
    get("/users/<name>", fun(name: String): Handler = {
        Response.websocket("/users/$name", /* websocket handler */)
    })
}

This means that a mapping could be added to Jetty's table for all possible values of /users/<name>.

Even if you ensure Response.websocket() only runs if, say, a user with the given name exists in the database, that's still pretty suboptimal.

The problem is my websocket Jetty code in general. It's a pretty big hack, but I'm not familiar enough with Jetty's API to improve it just yet.

Some objectives that drove my current approach that I want to maintain:

  • End-user should be able to wrap a websocket endpoint behind existing middleware stacks, like inside a group or router that ensures that the user is an admin.
  • The websocket handler should access upstream context (like values set by upstream middleware) and the kog.Request.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions