packages feed

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