https://kotlinlang.org logo
#http4k
Title
a

Albert Latacz

10/05/2021, 2:04 PM
Try this
Copy code
import org.http4k.core.ContentType.Companion.TEXT_HTML
import org.http4k.core.Method
import org.http4k.core.Response
import org.http4k.core.Status.Companion.OK
import org.http4k.core.then
import org.http4k.core.with
import org.http4k.filter.CorsPolicy.Companion.UnsafeGlobalPermissive
import org.http4k.filter.ServerFilters
import org.http4k.lens.Header.CONTENT_TYPE
import org.http4k.lens.Path
import org.http4k.routing.bind
import org.http4k.routing.path
import org.http4k.routing.routes
import org.http4k.routing.sse
import org.http4k.server.PolyHandler
import org.http4k.server.Undertow
import org.http4k.server.asServer
import org.http4k.sse.Sse
import org.http4k.sse.SseFilter
import org.http4k.sse.SseMessage
import org.http4k.sse.then

fun main() {
    val namePath = Path.of("name")

    val sayHello = SseFilter { next ->
        {
            println("Hello from the sse!")
            next(it)
        }
    }

    val sse = sayHello.then(
        sse(
            "/{name}" bind { sse: Sse ->
                val name = namePath(sse.connectRequest)
                sse.send(SseMessage.Data("hello $name"))
                sse.onClose { println("$name is closing") }
            }
        )
    )

    val routes = routes("/hello/{name}" bind Method.GET to {
        Response(OK).body(
            """
            <!DOCTYPE html>
            <html>
            <body>

            <h1>Getting server updates</h1>
            <div id="result"></div>

            <script>
            if(typeof(EventSource) !== "undefined") {
              var source = new EventSource("<http://localhost:8080/${it.path(>"name")}");
              source.onmessage = function(event) {
                document.getElementById("result").innerHTML += event.data + "<br>";
              };
            } else {
              document.getElementById("result").innerHTML = "Sorry, your browser does not support server-sent events...";
            }
            </script>

            </body>
            </html>
        """.trimIndent()
        ).with(CONTENT_TYPE of TEXT_HTML)
    }
    )
    val http = ServerFilters.Cors(UnsafeGlobalPermissive).then(routes)

    PolyHandler(http, sse = sse).asServer(Undertow(8080)).start()
}
and hit http://localhost:8080/hello/serverSentEvent