module Web.SocketIO.Log ((<>), logRaw, logWithSession, logWithSessionID) where
import Web.SocketIO.Types
import Control.Concurrent.Chan
import Control.Monad.Trans (liftIO, MonadIO)
logRaw :: (Functor m, MonadIO m, ConnectionLayer m) => (ByteString -> Log) -> ByteString -> m ()
logRaw logType message = do
logLevel' <- fmap logLevel getConfiguration
logChannel <- fmap envLogChannel getEnv
if level <= logLevel' then liftIO $ writeChan logChannel (serialize log') else return ()
where log' = logType message
levelOf (Error _) = 0
levelOf (Warn _) = 1
levelOf (Info _) = 2
levelOf (Debug _) = 3
level = levelOf log'
logWithSessionID :: (Functor m, MonadIO m, ConnectionLayer m) => (ByteString -> Log) -> SessionID -> ByteString -> m ()
logWithSessionID logType sessionID message = logRaw logType (sessionID <> " " <> serialize message)
logWithSession :: (Functor m, MonadIO m, ConnectionLayer m, SessionLayer m) => (ByteString -> Log) -> ByteString -> m ()
logWithSession logType message = do
Session sessionID _ _ _ _ <- getSession
logRaw logType $ fromByteString (sessionID <> " " <> message)