You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

40 lines
1.1 KiB

package outwatch.util
import cats.effect.Sync
import colibri._
import org.scalajs.dom.Event
import org.scalajs.dom.MessageEvent
import outwatch.helpers._
object WebSocketF {
implicit def toObserver[F[_]: Sync](
socket: WebSocketF[F]
): F[Observer[String]] =
socket.sink
implicit def toObservable[F[_]: Sync](
socket: WebSocketF[F]
): Observable[MessageEvent] =
socket.source
}
class WebSocketF[F[_]](val url: String)(implicit F: Sync[F]) {
val ws = new org.scalajs.dom.WebSocket(url)
val source: Observable[MessageEvent] =
Observable.create[MessageEvent] { observer =>
ws.onmessage = (e: MessageEvent) => observer.onNext(e)
ws.onerror =
(e: Event) => observer.onError(new Exception(s"Error in WebSocket: $e"))
Cancelable(() => ws.close())
}
val sink: F[Observer[String]] = {
F.delay {
new Observer[String] {
override def onNext(elem: String): Unit = ws.send(elem)
override def onError(ex: Throwable): Unit =
OutwatchTracing.errorSubject.onNext(ex)
}
}
}
}