Deadpan-DDP 0.8.0.0 → 0.9.0.0
raw patch · 8 files changed
+49/−50 lines, 8 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Data.EJson: decodeByteString :: ByteString -> Maybe EJsonValue
+ Data.EJson: decodeString :: String -> Maybe EJsonValue
+ Data.EJson: decodeText :: Text -> Maybe EJsonValue
+ Web.DDP.Deadpan.DSL: fetchMessagesThenExit :: DeadpanApp a -> DeadpanApp a
- Web.DDP.Deadpan.DSL: body :: Lens (LookupItem a_ajDk) (LookupItem a_ajEj) a_ajDk a_ajEj
+ Web.DDP.Deadpan.DSL: body :: Lens (LookupItem a_ajFx) (LookupItem a_ajGw) a_ajFx a_ajGw
- Web.DDP.Deadpan.DSL: callbackSet :: Lens (AppState cb_ajEA) (AppState cb_ajG2) (Lookup cb_ajEA) (Lookup cb_ajG2)
+ Web.DDP.Deadpan.DSL: callbackSet :: Lens (AppState cb_ajGN) (AppState cb_ajIf) (Lookup cb_ajGN) (Lookup cb_ajIf)
- Web.DDP.Deadpan.DSL: collections :: Lens' (AppState cb_ajEA) EJsonValue
+ Web.DDP.Deadpan.DSL: collections :: Lens' (AppState cb_ajGN) EJsonValue
- Web.DDP.Deadpan.DSL: connection :: Lens' (AppState cb_ajEA) Connection
+ Web.DDP.Deadpan.DSL: connection :: Lens' (AppState cb_ajGN) Connection
- Web.DDP.Deadpan.DSL: deadpanApp :: Iso (DeadpanApp a_ajGt) (DeadpanApp a_ajKX) (ReaderT (TVar (AppState Callback)) IO a_ajGt) (ReaderT (TVar (AppState Callback)) IO a_ajKX)
+ Web.DDP.Deadpan.DSL: deadpanApp :: Iso (DeadpanApp a_ajIG) (DeadpanApp a_ajNa) (ReaderT (TVar (AppState Callback)) IO a_ajIG) (ReaderT (TVar (AppState Callback)) IO a_ajNa)
- Web.DDP.Deadpan.DSL: fetchMessages :: DeadpanApp ()
+ Web.DDP.Deadpan.DSL: fetchMessages :: DeadpanApp ThreadId
- Web.DDP.Deadpan.DSL: ident :: Lens' (LookupItem a_ajDk) GUID
+ Web.DDP.Deadpan.DSL: ident :: Lens' (LookupItem a_ajFx) GUID
Files
- Deadpan-DDP.cabal +1/−1
- changelog.md +4/−0
- src/Data/EJson.hs +18/−1
- src/Data/EJson/Aeson.hs +1/−1
- src/Main.hs +1/−4
- src/Web/DDP/Deadpan.hs +2/−2
- src/Web/DDP/Deadpan/Callbacks.hs +0/−35
- src/Web/DDP/Deadpan/DSL.hs +22/−6
Deadpan-DDP.cabal view
@@ -1,5 +1,5 @@ name: Deadpan-DDP-version: 0.8.0.0+version: 0.9.0.0 synopsis: Write clients for Meteor's DDP Protocol description: The Deadpan-DDP project includes a debugging-tool, as well as a general purpose library. .
changelog.md view
@@ -1,5 +1,9 @@ # Deadpan-DDP Change Log +## 0.9.0.0++* Fixed the exit error+ ## 0.8.0.0 * Made GUID newtype abstract to prevent abuse
src/Data/EJson.hs view
@@ -36,6 +36,10 @@ module Exports, + decodeText,+ decodeString,+ decodeByteString,+ matches, getInPath,@@ -66,9 +70,22 @@ import Data.Monoid as Exports import Control.Lens as Exports import Control.Monad.State (execState)-import Data.Text (Text())+import Data.Text (Text())+import Data.Aeson (decode)+import Data.EJson.Aeson() import qualified Data.HashMap.Strict as HM+import qualified Data.ByteString.Lazy.Char8 as C8+import qualified Data.Text as T++decodeText :: Text -> Maybe EJsonValue+decodeText = decodeString . T.unpack++decodeString :: String -> Maybe EJsonValue+decodeString = decode . C8.pack++decodeByteString :: C8.ByteString -> Maybe EJsonValue+decodeByteString = decode -- $setup -- >>> :set -XOverloadedStrings
src/Data/EJson/Aeson.hs view
@@ -30,4 +30,4 @@ -- take advantage of the Aeson functionality. -- -- This is not used internally.-instance ToJSON EJsonValue where toJSON = ejson2value+instance ToJSON EJsonValue where toJSON = ejson2value
src/Main.hs view
@@ -8,11 +8,8 @@ import System.Exit import Web.DDP.Deadpan import System.Environment-import Data.Aeson import Data.Maybe import Control.Concurrent.Chan-import Data.EJson.Aeson()-import qualified Data.ByteString.Lazy.Char8 as C8 import qualified System.Console.Haskeline as R main :: IO ()@@ -53,7 +50,7 @@ sendPossibleMessage :: String -> DeadpanApp () sendPossibleMessage msgStr = do- let decoded = decode $ C8.pack msgStr+ let decoded = decodeString msgStr case decoded of Just m -> sendData m Nothing -> liftIO $ putStrLn "Invalid Message"
src/Web/DDP/Deadpan.hs view
@@ -53,12 +53,12 @@ -- Does not respond to ping! -- runConnectClient :: Params -> DeadpanApp a -> IO a-runConnectClient params app = runBareClient params (fetchMessages >> connect >> app)+runConnectClient params app = runBareClient params (fetchMessagesThenExit $ connect >> app) -- Same as runConnectClient above but allows specifying version -- runConnectClientVersion :: Params -> Version -> DeadpanApp a -> IO a-runConnectClientVersion params v app = runBareClient params (fetchMessages >> connectVersion v >> app)+runConnectClientVersion params v app = runBareClient params (fetchMessagesThenExit $ connectVersion v >> app) -- | Run a DeadpanApp after registering a ping handler, then establishing a server conncetion. --
src/Web/DDP/Deadpan/Callbacks.hs view
@@ -137,41 +137,6 @@ -- Server -->> Client --- Server Data Subscriptions---- TODO--- serverDataNosub :: Callback--- serverDataNosub = undefined--- TODO--- serverDataAdded :: Callback--- serverDataAdded = undefined--- TODO--- serverDataChanged :: Callback--- serverDataChanged = undefined--- TODO--- serverDataRemoved :: Callback--- serverDataRemoved = undefined--- TODO--- serverDataReady :: Callback--- serverDataReady = undefined--- TODO--- serverDataAddedBefore :: Callback--- serverDataAddedBefore = undefined--- TODO--- serverDataMovedBefore :: Callback--- serverDataMovedBefore = undefined----- Server RPC---- TODO--- serverRPCResult :: Callback--- serverRPCResult = undefined--- TODO--- serverRPCUpdated :: Callback--- serverRPCUpdated = undefined-- -- Server Errors -- TODO
src/Web/DDP/Deadpan/DSL.hs view
@@ -222,17 +222,33 @@ , ("support", ejarray reverseVersions) ] -- | Provides a way to fork a background thread running the app provided+-- fork :: DeadpanApp a -> DeadpanApp ThreadId fork app = do st <- DeadpanApp ask liftIO $ forkIO $ void $ runDeadpan app st -fetchMessages :: DeadpanApp ()-fetchMessages = void $- fork $- forever $ do message <- getServerMessage- as <- getAppState- respondToMessage (_callbackSet as) message+-- | Runs fetchMessages and kills the thread when the supplied app finishes.+--+-- Note: Any DeadpanApp calls made after this one will not be able to+-- interact with server-sent messages.+--+fetchMessagesThenExit :: DeadpanApp a -> DeadpanApp a+fetchMessagesThenExit app = do tid <- fetchMessages+ result <- app+ liftIO $ killThread tid+ return result++-- | Continuously pull down messages from the server in a background thread and+-- respond to each message with the callback set.+-- Returns a ThreadId so that this can be killed explicitly before the program+-- exits in order to avoid the "recv: invalid argument (Bad file descriptor)"+-- error.+--+fetchMessages :: DeadpanApp ThreadId+fetchMessages = fork $ forever $ do message <- getServerMessage+ as <- getAppState+ respondToMessage (_callbackSet as) message getServerMessage :: DeadpanApp (Maybe EJsonValue) getServerMessage = getAppState >>= liftIO . getEJ . _connection