packages feed

moesocks-1.0.0.43: src/Network/MoeSocks/App.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE LambdaCase #-}

module Network.MoeSocks.App where

import           Control.Concurrent.Async hiding (waitBoth)
import           Control.Lens

import           Network.MoeSocks.Bootstrap (loadConfig)
import           Network.MoeSocks.Handler (runRemoteRelay, runLocalService)
import           Network.MoeSocks.Helper ((-), io, error_, foreverRun)
import           Network.MoeSocks.Runtime (initRuntime)
import           Network.MoeSocks.Type (Env, Job(..), MoeMonad, env, jobs)
import qualified Network.MoeSocks.Type.Bootstrap.Option as O
import           Prelude hiding ((-), take)


runJob :: Env -> Job -> IO ()
runJob aEnv (RemoteRelayJob x)  = runRemoteRelay aEnv x
runJob aEnv (LocalServiceJob x)  = runLocalService aEnv x

runApp :: Env -> [Job] -> IO ()
runApp _ [] = error_ "No job to run"
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 <- initRuntime _config _options

  io - runApp (_runtime ^. env) (_runtime ^. jobs)