packages feed

heyefi-2.0.0.2: src/Main.hs

module Main where

import HEyefi.App (app)
import HEyefi.CommandLineOptions (handleOptionsThenMaybe)
import HEyefi.Config (monitorConfig, newConfig, runWithConfig)
import HEyefi.Constant (port, configPath)
import HEyefi.Log (logInfoIO)
import HEyefi.Prelude
import HEyefi.Types (SharedConfig)

import Control.Concurrent (forkIO)
import           Control.Concurrent.STM (
    newTVar
  , atomically
  , writeTVar
  , TVar
  , readTVar )
import Control.Monad (forever, void)
import Network.Wai.Handler.Warp (run)
import System.IO
import System.Posix.Signals (installHandler, sigHUP, Handler( Catch ))


handleHup :: TVar (Maybe Int) -> IO ()
handleHup wakeSig = atomically (writeTVar wakeSig (Just 1))

hangupSignal :: IO (TVar (Maybe Int))
hangupSignal = do
  wakeSig <- atomically (newTVar Nothing)
  _ <- installHandler sigHUP (Catch (handleHup wakeSig)) Nothing
  return wakeSig

readAndMonitorSharedConfig :: TVar (Maybe Int) ->
                              SharedConfig ->
                              IO ()
readAndMonitorSharedConfig wakeSig sharedConfig =
  void (forkIO (forever
          (do
              c <- atomically (readTVar sharedConfig)
              runWithConfig c (
                monitorConfig (unpack configPath) sharedConfig wakeSig))))

runHeyefi :: IO ()
runHeyefi = do
  wakeSig <- hangupSignal
  sharedConfig <- newConfig

  readAndMonitorSharedConfig wakeSig sharedConfig

  logInfoIO (listeningOnPort (tshow port))
  run port (app sharedConfig)

main :: IO ()
main = do
  hSetBuffering stdout LineBuffering
  handleOptionsThenMaybe runHeyefi