Skip to content

Instantly share code, notes, and snippets.

@dacr
Created May 28, 2023 10:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dacr/f68ba493dd77859b8f3b0add519cf668 to your computer and use it in GitHub Desktop.
Save dacr/f68ba493dd77859b8f3b0add519cf668 to your computer and use it in GitHub Desktop.
Simple websocket example / published by https://github.com/dacr/code-examples-manager #5642b2ef-3f21-4a10-8924-f435bb69306d/1e3f1423a40161e940105b028bbc9ac97d3701d2
// summary : Simple websocket example
// keywords : scala, zio, sttp, websocket
// publish : gist
// authors : David Crosson
// license : Apache NON-AI License Version 2.0 (https://raw.githubusercontent.com/non-ai-licenses/non-ai-licenses/main/NON-AI-APACHE2)
// id : 5642b2ef-3f21-4a10-8924-f435bb69306d
// created-on : 2022-12-30T09:25:55+01:00
// managed-by : https://github.com/dacr/code-examples-manager
// run-with : scala-cli $file
// ---------------------
//> using scala "3.2.1"
//> using dep "dev.zio::zio:2.0.6"
//> using dep "com.softwaremill.sttp.client3::zio:3.8.8"
// ---------------------
import zio.*
import sttp.client3.*, sttp.client3.basicRequest.*, sttp.ws.*, sttp.model.*
object WebSocketCat extends ZIOAppDefault {
val defaultTarget = "wss://ws.postman-echo.com/raw" // This is an echo service also
// val defaultTarget = "ws://127.0.0.1:3000/ws/test/echo"
//val defaultTarget = "ws://127.0.0.1:3000/ws/test/stream"
def processWebsocket(ws: WebSocket[Task]): Task[Unit] = {
val receiveOne = ws.receiveText().flatMap(res => Console.printLine(s"$res"))
val sendOne = Console.readLine.flatMap(line => ws.sendText(line))
receiveOne.forever.race(sendOne.forever)
}
def run =
for {
args <- getArgs
target = args.headOption.getOrElse(defaultTarget)
targetURI <- ZIO.fromEither(Uri.parse(target))
backend <- sttp.client3.httpclient.zio.HttpClientZioBackend()
response <- basicRequest
.get(targetURI)
.response(asWebSocket(processWebsocket))
.send(backend)
} yield response
}
WebSocketCat.main(args)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment