purescript-httpurple/Library/HTTPure/Server.purs
2017-07-10 12:06:14 -07:00

58 lines
1.8 KiB
Haskell

module HTTPure.Server
( boot,
handleRequest,
serve
) where
import Prelude (pure, unit, (>>=))
import Data.Maybe as Maybe
import Node.HTTP as HTTP
import HTTPure.HTTPureM as HTTPureM
import HTTPure.Request as Request
import HTTPure.Response as Response
import HTTPure.Route as Route
-- | This function takes an array of Routes, a request, and a response, and
-- | routes the request to the correct Routes. After the Routes have run, this
-- | function closes the request stream.
handleRequest :: forall e.
Array (Route.Route e) ->
HTTP.Request ->
HTTP.Response ->
HTTPureM.HTTPureM e
handleRequest routes request response =
case Route.match routes req of
Maybe.Just route -> Route.run route req resp
Maybe.Nothing -> pure unit
where
req = Request.fromHTTPRequest request
resp = Response.fromHTTPResponse response
-- | Given an options object, an Array of Routes, and an HTTPureM containing
-- | effects to run on boot, creates and runs a HTTPure server.
boot :: forall e.
HTTP.ListenOptions ->
Array (Route.Route e) ->
HTTPureM.HTTPureM e ->
HTTPureM.HTTPureM e
boot options routes onStarted =
HTTP.createServer (handleRequest routes) >>= \server ->
HTTP.listen server options onStarted
-- | Create and start a server. This is the main entry point for HTTPure. Takes
-- | a port number on which to listen, an Array of Routes to serve, and an
-- | HTTPureM containing effects to run after the server has booted (usually
-- | logging). Returns an HTTPureM containing the server's effects.
serve :: forall e.
Int ->
Array (Route.Route e) ->
HTTPureM.HTTPureM e ->
HTTPureM.HTTPureM e
serve port = boot
{ hostname: "localhost"
, port: port
, backlog: Maybe.Nothing
}