module Database.TinkerPop.Internal where
import Database.TinkerPop.Types
import Prelude hiding (putStrLn)
import Data.Text (Text, pack, append)
import Data.Text.IO
import Data.Text.Encoding
import qualified Data.Map.Strict as M
import qualified Control.Monad.STM as S
import qualified Control.Concurrent.STM.TChan as S
import qualified Control.Concurrent.STM.TVar as S
import Control.Concurrent
import Control.Monad (forever)
import Control.Lens
import Data.Aeson (eitherDecodeStrict)
import qualified Network.WebSockets as WS
inStatus2xx :: Int -> Bool
inStatus2xx x = (x `quot` 100) == 2
handle :: Connection -> IO (ThreadId)
handle conn = do
forkIO $ forever $ do
msg <- WS.receiveData (conn ^. socket) :: IO Text
case eitherDecodeStrict (encodeUtf8 msg) of
Right r -> do
cs <- S.readTVarIO (conn ^. chans)
case M.lookup (r ^. requestId) cs of
Just chan -> S.atomically $ S.writeTChan chan (Right r)
Nothing -> putStrLn $ "ERROR: chan not found"
Left s -> putStrLn $ "ERROR: parse response message: " `append` (pack s)
close :: Connection -> IO ()
close conn = do
WS.sendClose (conn ^. socket) ("Bye!" :: Text)