module Web.DDP.Deadpan.Callbacks where
import Web.DDP.Deadpan.DSL
import Control.Concurrent.MVar
import Control.Monad.State
import Control.Monad.IfElse (awhen)
import Control.Lens
import Data.UUID.V4 (nextRandom)
import Data.UUID (toString)
newID :: DeadpanApp Text
newID = do guid <- liftIO nextRandom
let str = toString guid
text = pack str
return text
pingCallback :: Callback
pingCallback ejv = do
let mpid = ejv ^. _EJObjectKey "id"
case mpid of Just pid -> sendMessage "pong" $ ejobject [("id", pid)]
Nothing -> sendMessage "pong" $ ejobject []
clientDataSub :: Text -> Text -> Maybe [ EJsonValue ] -> DeadpanApp ()
clientDataSub subid name Nothing
= sendMessage "sub" $ ejobject [("name", ejstring name)
,("id", ejstring subid)]
clientDataSub subid name (Just params)
= sendMessage "sub" $ ejobject [("name", ejstring name)
,("params", ejarray params)
,("id", ejstring subid)]
subscribe :: Text -> Text -> Maybe [ EJsonValue ] -> DeadpanApp ()
subscribe = clientDataSub
clientDataUnsub :: Text -> DeadpanApp ()
clientDataUnsub subid = sendMessage "unsub" $ ejobject [("id", ejstring subid)]
unsubscribe :: Text -> DeadpanApp ()
unsubscribe = clientDataUnsub
clientRPCMethod :: Text -> Maybe [EJsonValue] -> Text -> Maybe Text -> DeadpanApp ()
clientRPCMethod method params rpcid seed = do
let msg = [("method", ejstring method), ("id", ejstring rpcid)]
&~ do awhen params $ \v -> modify (("params", ejarray v) :)
awhen seed $ \v -> modify (("seed", ejstring v) :)
sendMessage "method" (ejobject msg)
rpcWait :: Text -> Maybe [EJsonValue] -> DeadpanApp (Either EJsonValue EJsonValue)
rpcWait method params = do uuid <- newID
mv <- liftIO $ newEmptyMVar
setIdHandler uuid (handler mv uuid)
clientRPCMethod method params uuid Nothing
val <- liftIO $ readMVar mv
return val
where
handler mv uuid itm = do
awhen (itm ^. _EJObjectKey "error") $ \err -> do
liftIO $ putMVar mv (Left err)
deleteHandlerID uuid
awhen (itm ^. _EJObjectKey "result") $ \result -> do
liftIO $ putMVar mv (Right result)
deleteHandlerID uuid
serverDataNosub :: Callback
serverDataNosub = undefined
serverDataAdded :: Callback
serverDataAdded = undefined
serverDataChanged :: Callback
serverDataChanged = undefined
serverDataRemoved :: Callback
serverDataRemoved = undefined
serverDataReady :: Callback
serverDataReady = undefined
serverDataAddedBefore :: Callback
serverDataAddedBefore = undefined
serverDataMovedBefore :: Callback
serverDataMovedBefore = undefined
serverRPCResult :: Callback
serverRPCResult = undefined
serverRPCUpdated :: Callback
serverRPCUpdated = undefined
serverError :: Callback
serverError = undefined