Recipe: REST + WebSockets on one port

Goal: Serve HTTP APIs and a WebSocket endpoint from one server.

open Suave
open Suave.Filters
open Suave.Operators
open Suave.Successful
open Suave.WebSocket
open Suave.Sockets
open Suave.Sockets.Control

let ws (webSocket : WebSocket) (_ : HttpContext) =
  socket {
    let mutable loop = true
    while loop do
      let! msg = webSocket.read()
      match msg with
      | (Text, data, true) -> do! webSocket.send Text data true
      | (Close, _, _) -> loop <- false
      | _ -> ()
  }

let app = choose [
  path "/websocket" >=> handShake ws
  GET >=> path "/api/health" >=> OK "ok"
  RequestErrors.NOT_FOUND "Not found"
]

startWebServer defaultConfig app

Guide: WebSockets.