growler 0.4.0 → 0.5.0
raw patch · 3 files changed
+42/−15 lines, 3 filesdep ~aesondep ~case-insensitivedep ~monad-controlPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: aeson, case-insensitive, monad-control, pipes, pipes-aeson, pipes-wai, transformers-base, vector, warp
API changes (from Hackage documentation)
+ Web.Growler.EventSource: eventSource :: MonadIO m => IO ServerEvent -> HandlerT m ()
+ Web.Growler.Types: StHandlerT :: Either ResponseState (a, ResponseState) -> StHandlerT a
+ Web.Growler.Types: newtype StHandlerT a
+ Web.Growler.Types: unStHandlerT :: StHandlerT a -> Either ResponseState (a, ResponseState)
Files
- growler.cabal +17/−11
- src/Web/Growler/EventSource.hs +19/−0
- src/Web/Growler/Types.hs +6/−4
growler.cabal view
@@ -2,7 +2,7 @@ -- documentation, see http://haskell.org/cabal/users-guide/ name: growler-version: 0.4.0+version: 0.5.0 synopsis: A revised version of the scotty library that attempts to be simpler and more performant. description: Growler provides a very similar interface to scotty, with slight tweaks for performance and a few feature tradeoffs. Growler provides the ability to abort actions (handlers) with arbitrary responses, not just in the event of redirects or raising errors. Growler avoids coercing everything into lazy Text values and reading the whole request body into memory. It also eliminates the ability to abort the handler and have another handler handle the request instead (Scotty's 'next' function). .@@ -33,7 +33,13 @@ cabal-version: >=1.10 library- exposed-modules: Web.Growler, Web.Growler.Handler, Web.Growler.Parsable, Web.Growler.Router, Web.Growler.Types+ exposed-modules: Web.Growler,+ Web.Growler.Handler,+ Web.Growler.Parsable,+ Web.Growler.Router,+ Web.Growler.Types,+ Web.Growler.EventSource+ other-extensions: OverloadedStrings, FlexibleContexts, FlexibleInstances, LambdaCase, RankNTypes, ScopedTypeVariables build-depends: base >=4.6 && <5, lens >=4.5 && <5,@@ -46,15 +52,15 @@ regex-compat >=0.95 && <1, blaze-builder >=0.3 && <0.7, unordered-containers >=0.2 && <0.9,- aeson,- vector,- case-insensitive,- warp,- pipes,- pipes-aeson,- pipes-wai,- monad-control,+ aeson >= 0.8,+ vector >= 0.7.1,+ case-insensitive >= 1.2,+ warp >= 3,+ pipes >= 4.0 && <4.2,+ pipes-aeson >= 0.4,+ pipes-wai >= 3,+ monad-control == 1.*, either >= 4.3.1,- transformers-base+ transformers-base >= 0.4 hs-source-dirs: src default-language: Haskell2010
+ src/Web/Growler/EventSource.hs view
@@ -0,0 +1,19 @@+{-# LANGUAGE OverloadedStrings #-}+module Web.Growler.EventSource where+import Blaze.ByteString.Builder (Builder)+import Control.Monad.Trans+import Data.Function (fix)+import Network.HTTP.Types (hContentType, status200)+import Network.Wai.EventSource.EventStream+import Web.Growler++eventSource :: MonadIO m => IO ServerEvent -> HandlerT m ()+eventSource m = do+ status status200+ setHeader hContentType "text/event-stream"+ stream $ \sendChunk flush -> fix $ \loop -> do+ se <- m+ case eventToBuilder se of+ Nothing -> return ()+ Just b -> sendChunk b >> flush >> loop+
src/Web/Growler/Types.hs view
@@ -127,8 +127,10 @@ instance MonadBase b m => MonadBase b (HandlerT m) where liftBase = liftBaseDefault +newtype StHandlerT a = StHandlerT { unStHandlerT :: Either ResponseState (a, ResponseState) }+ instance MonadTransControl HandlerT where- newtype StT HandlerT a = StHandlerT { unStHandlerT :: Either ResponseState (a, ResponseState) }+ type StT HandlerT a = StHandlerT a liftWith f = do r <- HandlerT ask s <- HandlerT get@@ -149,9 +151,9 @@ return x instance MonadBaseControl b m => MonadBaseControl b (HandlerT m) where- newtype StM (HandlerT m) a = StMHandlerT { unStMHandlerT :: StM m (StT HandlerT a) }- liftBaseWith = defaultLiftBaseWith StMHandlerT- restoreM = defaultRestoreM unStMHandlerT+ type StM (HandlerT m) a = ComposeSt HandlerT m a+ liftBaseWith = defaultLiftBaseWith+ restoreM = defaultRestoreM type Handler = HandlerT IO