hyperbole-0.5.0: Interactive HTML apps using type-safe serverside Haskell
Safe HaskellSafe-Inferred
LanguageGHC2021

Web.Hyperbole.Application

Synopsis

Documentation

websocketsOr :: ConnectionOptions -> ServerApp -> Application -> Application #

Upgrade a websockets ServerApp to a wai Application. Uses the given backup Application to handle Requests that are not WebSocket requests.

websocketsOr opts ws_app backup_app = \req respond -> case websocketsApp opts ws_app req of Nothing -> backup_app req send_response Just res -> respond res 

For example, below is an Application that sends "Hello, client!" to each connected client.

app :: Application app = websocketsOr defaultConnectionOptions wsApp backupApp where wsApp :: ServerApp wsApp pending_conn = do conn <- acceptRequest pending_conn sendTextData conn ("Hello, client!" :: Text) backupApp :: Application backupApp _ respond = respond $ responseLBS status400 [] "Not a WebSocket request" 

defaultConnectionOptions :: ConnectionOptions #

The default connection options:

  • Nothing happens when a pong is received.
  • Compression is disabled.
  • Lenient unicode decoding.
  • 30 second timeout for connection establishment.

liveApp :: (ByteString -> ByteString) -> Eff '[Hyperbole, Concurrent, IOE] Response -> Application Source #

Turn one or more Pages into a Wai Application. Respond using both HTTP and WebSockets

main :: IO () main = do run 3000 $ do liveApp quickStartDocument (runPage page)

liveAppWith :: ServerOptions -> Eff '[Hyperbole, Concurrent, IOE] Response -> Application Source #

Run a Hyperbole application, customizing both the document and the format of server errors

quickStartDocument :: ByteString -> ByteString Source #

A simple mobile-friendly document with all required embeds and live reload

liveApp quickStartDocument (routeRequest router) 

routeRequest :: (Hyperbole :> es, Route route) => (route -> Eff es Response) -> Eff es Response Source #

Route URL patterns to different pages

import Example.Docs.Page.Messages qualified as Messages import Example.Docs.Page.Users qualified as Users type UserId = Int data AppRoute = Main | Messages | User UserId deriving (Eq, Generic) instance Route AppRoute where baseRoute = Just Main router :: (Hyperbole :> es) => AppRoute -> Eff es Response router Messages = runPage Messages.page router (User cid) = runPage $ Users.page cid router Main = do pure $ view $ do el "click a link below to visit a page" route Messages "Messages" route (User 1) "User 1" route (User 2) "User 2"