softwaremill / sttp

The Scala HTTP client you always wanted!
https://sttp.softwaremill.com
Apache License 2.0
1.44k stars 301 forks source link

No way to send continuous WebSocketFrame with Fs2 stream pipes #1465

Open sguillaume-ledger opened 2 years ago

sguillaume-ledger commented 2 years ago

Hi,

I'm using sttp with tapir/http4s/fs2 to build a websocket server. My websocket endpoint is described with tapir as:

  val instance = endpoint.get
    .in(PREFIX)
    .out(webSocketBodyRaw(Fs2Streams[IO]))

and my business logic returns a fs2.Pipe[IO, WebSocketFrame, WebSocketFrame]

I have an use case when I would like to send a continuous WebSocketFrame (ie make a stream emit a continuous WebSocketFrame) which I can't since WebSocketFrame exposes the finalFragment parameter only, not the isContinuation one

isContinuation is exposed in sttp.ws.WebSocket#send which is called by sttp.client3.impl.fs2.Fs2WebSockets#handleThroughPipe with isContinuation always set to false.

Would that be possible to somehow expose the isContinuation flag when using the web socket with stream pipes ?

Thanks !

Regards, Sebastien

adamw commented 2 years ago

Hm I think this should be fixed in Fs2WebSockets.handleThroughPipe itself. If we get a frame with finalFragment = false, it means that all further frames (except this one), until we get a final one, should have isContinuation = true. So this can be computed, doesn't have to be exposed to the user.