danneu / kog

🌶 A simple Kotlin web framework inspired by Clojure's Ring.
43 stars 4 forks source link

Support websocket handlers on dynamic endpoints #15

Open danneu opened 7 years ago

danneu commented 7 years ago

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:

danneu commented 7 years ago

I'm thinking of removing the current websocket system (and the mess/hack in Server.kt) and replacing it with a simpler system where you just create a jetty websockethander and mount it separately from the req/res system.