```fun testDataGenerator(sse: Sse, start: Long = 0...
# http4k
s
Copy code
fun testDataGenerator(sse: Sse, start: Long = 0, delay: Long = 0, dataSource: (sequence: Int) -> SseMessage) {
    <http://logger.info|logger.info> { "Request from ${sse.connectRequest.uri}" }
    val closed = AtomicBoolean(false)
    sse.onClose { <http://logger.info|logger.info> { "Response body closed by client"; closed.set(true) } }
    Thread.sleep(start)
    for (i in 1..Int.MAX_VALUE) {
        if (closed.get())
            break
        try {
            val m = dataSource(i)
            if (m.event == null) {
                sse.send(Data(data = m.data.joinToString(" ")))
            } else {
                sse.send(Event(event = m.event!!, data = m.data.joinToString(" "), id = m.id))
            }
            logger.debug { "sent ${Clock.System.now().toEpochMilliseconds()}" }
            Thread.sleep(delay)
        } catch (_: EOFException) {
            <http://logger.info|logger.info> { "Response body closed by client" }
            break
        } catch (e: Throwable) {
            logger.error(e) { "Unexpected error writing to response body" }
            break
        }
    }
}
d
So have bashed this together and it seems to work (just sent >1000000 requests with no problem):
Copy code
import org.http4k.routing.bind
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.SseMessage
import kotlin.concurrent.thread

fun main() {
    PolyHandler(sse = sse(
        "/" bind { sse: Sse ->
            thread {
                for (i in 1..Int.MAX_VALUE) {
                    sse.send(SseMessage.Data("hello -> $i"))
                }
            }
        }
    )).asServer(Undertow(9000)).start()
}
How are you feeding events to the SSE? Looks like the setup function of the bind need to complete before any messages are sent (because of the blocking handler in undertow presumably)