module Network.WebSockets.Snap
( runWebSocketsSnap
, runWebSocketsSnapWith
) where
import qualified Network.WebSockets as WS
import qualified Snap.Core as Snap
import qualified Snap.Internal.Http.Types as Snap
import qualified Snap.Types.Headers as Headers
runWebSocketsSnap :: WS.Protocol p
=> (WS.Request -> WS.WebSockets p ())
-> Snap.Snap ()
runWebSocketsSnap = runWebSocketsSnapWith WS.defaultWebSocketsOptions
runWebSocketsSnapWith :: WS.Protocol p
=> WS.WebSocketsOptions
-> (WS.Request -> WS.WebSockets p ())
-> Snap.Snap ()
runWebSocketsSnapWith options ws = do
rq <- Snap.getRequest
Snap.escapeHttp $ \tickle writeEnd ->
let options' = options
{ WS.onPong = tickle (+ 30) >> WS.onPong options
}
in WS.runWebSocketsWith options' (fromSnapRequest rq) ws writeEnd
fromSnapRequest :: Snap.Request -> WS.RequestHttpPart
fromSnapRequest rq = WS.RequestHttpPart
{ WS.requestHttpPath = Snap.rqURI rq
, WS.requestHttpHeaders = Headers.toList (Snap.rqHeaders rq)
, WS.requestHttpSecure = Snap.rqIsSecure rq
}