Hash2Pub/app/Main.hs

60 lines
2.1 KiB
Haskell
Raw Normal View History

2020-03-20 19:01:25 +01:00
module Main where
import Control.Concurrent
2020-05-29 17:39:35 +02:00
import Control.Concurrent.Async
import Control.Concurrent.STM
import Control.Concurrent.STM.TVar
import Control.Exception
2020-05-27 19:10:45 +02:00
import Data.Either
import Data.IP (IPv6, toHostAddress6)
import System.Environment
import Hash2Pub.FediChord
2020-03-20 19:01:25 +01:00
main :: IO ()
main = do
-- ToDo: parse and pass config
-- probably use `tomland` for that
conf <- readConfig
-- ToDo: load persisted caches, bootstrapping nodes …
2020-05-12 21:24:56 +02:00
(serverSock, thisNode) <- fediChordInit conf
print =<< readTVarIO thisNode
2020-05-12 21:24:56 +02:00
print serverSock
-- currently no masking is necessary, as there is nothing to clean up
cacheWriterThread <- forkIO $ cacheWriter thisNode
-- try joining the DHT using one of the provided bootstrapping nodes
let
tryJoining (bn:bns) = do
j <- fediChordBootstrapJoin thisNode bn
case j of
2020-05-27 18:59:38 +02:00
Left err -> putStrLn ("join error: " <> err) >> tryJoining bns
Right joined -> pure $ Right joined
tryJoining [] = pure $ Left "Exhausted all bootstrap points for joining."
joinedState <- tryJoining $ confBootstrapNodes conf
2020-05-29 17:39:35 +02:00
either (\err -> do
2020-05-27 18:59:38 +02:00
-- handle unsuccessful join
putStrLn $ err <> " Error joining, start listening for incoming requests anyways"
2020-05-29 17:39:35 +02:00
wait =<< async (fediMainThreads serverSock thisNode)
2020-05-27 18:59:38 +02:00
-- TODO: periodic retry
)
2020-05-29 17:39:35 +02:00
(\joinedNS -> do
2020-05-27 18:59:38 +02:00
-- launch main eventloop with successfully joined state
putStrLn "successful join"
2020-05-29 17:39:35 +02:00
wait =<< async (fediMainThreads serverSock thisNode)
2020-05-27 18:59:38 +02:00
)
joinedState
pure ()
readConfig :: IO FediChordConf
readConfig = do
confDomainString : ipString : portString : bootstrapHost : bootstrapPortString : _ <- getArgs
pure $ FediChordConf {
confDomain = confDomainString
, confIP = toHostAddress6 . read $ ipString
, confDhtPort = read portString
, confBootstrapNodes = [(bootstrapHost, read bootstrapPortString)]
--, confStabiliseInterval = 60
}