![chris-hristov-itgKm0zOdzQ-unsplash.jpg](/_next/image?url=https%3A%2F%2Fimages.ctfassets.net%2Fai4vjpehjr3j%2F2sK69ZPSV1eIP6rHgzhs3v%2F57f40f5db2109af7c6a2c7e88628fa3c%2Fchris-hristov-itgKm0zOdzQ-unsplash.jpg&w=3840&q=75)
ZStreamとFs2Streamを相互変換する
![Kazuki Moriyama](/_next/image?url=https%3A%2F%2Fimages.ctfassets.net%2Fai4vjpehjr3j%2F2Oa6QzkYOe51LQiER7VEtN%2F6e819c38a98a1c649401b86861c40d53%2Fimage.png&w=96&q=75)
Kazuki Moriyama (森山 和樹)
ZIOを使ってサーバーを立てるときたまにwebsocketを使用したい時がある。
内部的にはZStreamを使用しているので、後はそれをhttp serverにつなぎこむだけなのだが、今の所ZIO×http serverのstableなライブラリはない。
そんなときによくhpp4sでサーバーを立て、ZStreamをfs2Streamに変換してwebsocketを実装している。
そのやり方。
zio.stream.interop.fs2zを使う
変換と言ってもすでにライブラリ側で実装されてるのでそれを使うだけ。
まずはinteropを依存に含める。
libraryDependencies += "dev.zio" %% "zio-interop-cats" % <Version>
その後importして使うだけ。
import zio.stream.interop.fs2z.\_
import zio.stream.\_
object A {
val zs: ZStream\[Any, Throwable, String\] = ???
val fss: fs2.Stream\[ZIO\[Any, Throwable, \*\], String\] = zs.toFs2Stream
val zs2: ZStream\[Any, Throwable, String\] = fss.toZStream
}
zioは書くライブラリとのinteropが多数用意されていて非常に運用が楽。