moesocks-0.1.2.30: src/Network/MoeSocks/App.hs
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE LambdaCase #-}
module Network.MoeSocks.App where
import Control.Concurrent.Async hiding (waitBoth)
{-import Control.Concurrent.STM-}
import Control.Lens
import Control.Monad
import Network.MoeSocks.Handler (runRemoteRelay, runLocalService)
import Network.MoeSocks.Helper
import Network.MoeSocks.Bootstrap (loadConfig)
import Network.MoeSocks.Runtime (initRuntime)
import Network.MoeSocks.Type
import Prelude hiding ((-), take)
import qualified Network.MoeSocks.Type.Bootstrap.Option as O
{-runJob :: Env -> Job -> TVar JobStatus -> IO ()-}
{-runJob aEnv (RemoteRelayJob x) _ = runRemoteRelay aEnv x-}
{-runJob aEnv (LocalServiceJob x) _ = runLocalService aEnv x-}
{-runApp :: Env -> [Job] -> IO ()-}
{-runApp aEnv someJobs = do-}
{-_jobs <- (forM someJobs - \_job -> (,) _job-}
{-<$> newTVarIO initialJobStatus)-}
{-_asyncs <- mapM (async . foreverRun . (uncurry (runJob aEnv))) _jobs-}
{-_mainThread <- async - do-}
{-waitAnyCancel - _asyncs-}
{-_uiThread <- async - forever - do-}
{-let _statuses = _jobs ^.. each . _2 :: [TVar JobStatus]-}
{-[>forM_ _statuses - readTVarIO >=> print<]-}
{-sleep 5-}
{-waitAnyCancel [_mainThread, _uiThread]-}
{-pure ()-}
runJob :: Env -> Job -> IO ()
runJob aEnv (RemoteRelayJob x) = runRemoteRelay aEnv x
runJob aEnv (LocalServiceJob x) = runLocalService aEnv x
runApp :: Env -> [Job] -> IO ()
runApp aEnv someJobs = do
_asyncs <- mapM (async . foreverRun . runJob aEnv) someJobs
waitAnyCancel - _asyncs
pure ()
moeApp:: O.Options -> MoeMonad ()
moeApp someOptions = do
let _options = someOptions
_config <- loadConfig - _options
(_runtime, _jobs) <- initRuntime _config _options
io - runApp (_runtime ^. env) _jobs