packages feed

bein-0.3.3: Bein/Web.hs

module Main where

import Bein.Web.Types
import Bein.Web.Commands
import Bein.Web.Routing
import qualified System.Posix.Daemonize as D
import Happstack.Server
import Control.Concurrent
import Control.Monad.Trans
import Control.Monad.Reader
import Control.Concurrent.STM
import Database.HDBC.PostgreSQL
import Bein.Configuration
import Network
import System.IO

main :: IO ()
main = D.serviced $ D.simpleDaemon { D.program = httpd, D.user = Just "bein", D.group = Just "bein" }

getPort :: WebState -> IO Int
getPort st = (liftIO.atomically.readTVar.configT) st >>= return.http_port

httpd :: a -> IO ()
httpd _ = getState >>= \s -> do 
  p <- getPort s
  runReaderT sessionExpirer s
  simpleHTTP' (\a -> runReaderT a s) (Conf p Nothing) routing

sessionExpirer :: BeinM WebState ThreadId
sessionExpirer = forkR f
  where f = do update "select remove_expired_sessions()" []
               liftIO $ threadDelay (5*60*1000000)
               f

getState :: IO WebState
getState = do
  conn <- connectPostgreSQL "dbname=bein"
  config <- readConfiguration conn
  configTV <- newTVarIO config
  sockMV <- (connectTo "" (UnixSocket (daemon_port config)) >>= \h -> do
                hSetBuffering h LineBuffering                                       
                newMVar h) `catch` (\_ -> newEmptyMVar)
  return $ WebState { stDb = conn, stConfigT = configTV, stDaemonPort = sockMV, 
                      stObject = undefined, stUser = Nothing }