module Database.Redis.Server (
runServer,
ServerSettings, serverSettings,
def,
) where
import Blaze.ByteString.Builder
import Control.Monad.Logger
import Data.Conduit
import Data.Conduit.Attoparsec (conduitParser)
import Data.Conduit.Internal (sinkToPipe, sourceToPipe)
import qualified Data.Conduit.List as CL
import Data.Conduit.Network
import Data.Monoid
import qualified Data.Text as T
import Network (withSocketsDo)
import Database.Curry
import Database.Redis.Builder
import Database.Redis.Commands
import Database.Redis.Parser
import Database.Redis.Types
runServer :: Config -> ServerSettings (RedisT IO) -> IO ()
runServer conf ss = withSocketsDo $ runDBMT conf $ do
$logInfo $ "listen on port " <> (T.pack $ show $ serverPort ss) <> "."
runTCPServer ss $ \ad -> do
runPipe
$ sourceToPipe (appSource ad)
>+> injectLeftovers (conduitParser parseRequest)
>+> CL.mapM (fmap (toByteString . fromReply) . process)
>+> sinkToPipe (appSink ad)