@@ -1,23 +1,24 @@
1−{-# LANGUAGE AllowAmbiguousTypes #-}
1+{-# LANGUAGE AllowAmbiguousTypes #-}
2−{-# LANGUAGE CPP #-}
2+{-# LANGUAGE CPP #-}
3−{-# LANGUAGE DataKinds #-}
3+{-# LANGUAGE DataKinds #-}
4−{-# LANGUAGE FlexibleContexts #-}
4+{-# LANGUAGE FlexibleContexts #-}
5−{-# LANGUAGE FlexibleInstances #-}
5+{-# LANGUAGE FlexibleInstances #-}
6−{-# LANGUAGE GeneralizedNewtypeDeriving #-}
7−{-# LANGUAGE InstanceSigs #-}
6+{-# LANGUAGE InstanceSigs #-}
7+{-# LANGUAGE OverloadedStrings #-}
8+{-# LANGUAGE PolyKinds #-}
9+{-# LANGUAGE ScopedTypeVariables #-}
10+{-# LANGUAGE TupleSections #-}
11+{-# LANGUAGE TypeFamilies #-}
12+{-# LANGUAGE TypeOperators #-}
13+{-# LANGUAGE UndecidableInstances #-}
8−{-# LANGUAGE MultiParamTypeClasses #-}
14+{-# LANGUAGE MultiParamTypeClasses #-}
9−{-# LANGUAGE OverloadedStrings #-}
15+{-# LANGUAGE OverloadedStrings #-}
10−{-# LANGUAGE PolyKinds #-}
16+{-# LANGUAGE PolyKinds #-}
11−{-# LANGUAGE Rank2Types #-}
12−{-# LANGUAGE ScopedTypeVariables #-}
17+{-# LANGUAGE ScopedTypeVariables #-}
13−{-# LANGUAGE TupleSections #-}
18+{-# LANGUAGE TupleSections #-}
14−{-# LANGUAGE TypeFamilies #-}
19+{-# LANGUAGE TypeFamilies #-}
15−{-# LANGUAGE TypeOperators #-}
20+{-# LANGUAGE TypeOperators #-}
16−{-# LANGUAGE UndecidableInstances #-}
21+{-# LANGUAGE UndecidableInstances #-}
18−#if MIN_VERSION_base(4,9,0)
19−{-# OPTIONS_GHC -fno-warn-redundant-constraints #-}
22-- #include "overlapping-compat.h"
23-- #include "overlapping-compat.h"
23-- | This module provides 'client' which can automatically generate
24-- | This module provides 'client' which can automatically generate
@@ -25,57 +26,47 @@
26module Servant.Reflex
27module Servant.Reflex
29− , clientWithOptsAndResultHandler
31− , clientWithRouteAndResultHandler
32 , BuildHeaderKeysTo(..)
29 , BuildHeaderKeysTo(..)
33 , toHeaders
30 , toHeaders
34− , HasClient
31+ , HasClient(..)
36 , module Servant.Common.Req
32 , module Servant.Common.Req
37 , module Servant.Common.BaseUrl
33 , module Servant.Common.BaseUrl
40------------------------------------------------------------------------------
36------------------------------------------------------------------------------
41import Control.Applicative
38import Control.Applicative
42−import qualified Data.CaseInsensitive as CI
43−import Data.Functor.Identity
44−import qualified Data.Map as Map
45import Data.Monoid ((<>))
39import Data.Monoid ((<>))
46−import Data.Proxy (Proxy (..))
47import qualified Data.Set as Set
40import qualified Data.Set as Set
41+import qualified Data.Text.Encoding as E
42+import Data.CaseInsensitive (mk)
43+import Data.Functor.Identity
44+import Data.Proxy (Proxy (..))
45+import qualified Data.Map as Map
48import Data.Text (Text)
46import Data.Text (Text)
49import qualified Data.Text as T
47import qualified Data.Text as T
50−import qualified Data.Text.Encoding as E
51−import GHC.Exts (Constraint)
52import GHC.TypeLits (KnownSymbol, symbolVal)
48import GHC.TypeLits (KnownSymbol, symbolVal)
53−import Servant.API ((:<|>) (..), (:>), BasicAuth,
49+import Servant.API ((:<|>)(..),(:>), BasicAuth,
54− BasicAuthData, BuildHeadersTo (..),
50+ BasicAuthData, BuildHeadersTo(..),
55− Capture, Header, Headers (..),
51+ Capture, contentType, Header,
56− HttpVersion, IsSecure,
52+ Headers(..), HttpVersion, IsSecure,
57− MimeRender (..), MimeUnrender,
53+ MimeRender(..), MimeUnrender,
58 NoContent, QueryFlag, QueryParam,
54 NoContent, QueryFlag, QueryParam,
59− QueryParams, Raw, ReflectMethod (..),
55+ QueryParams, Raw, ReflectMethod(..),
60 RemoteHost, ReqBody,
56 RemoteHost, ReqBody,
61− ToHttpApiData (..), Vault, Verb,
57+ ToHttpApiData(..), Vault, Verb)
63−import Servant.API.Description (Summary)
64−import qualified Servant.Auth as Auth
66−import Reflex.Dom.Core (Dynamic, Event, Reflex,
59+import Reflex.Dom (Dynamic, Event, Reflex,
67− XhrRequest (..), XhrResponse (..),
60+ XhrRequest(..),
68− XhrResponseHeaders (..),
61+ XhrResponseHeaders(..),
69− attachPromptlyDynWith, constDyn, ffor,
62+ XhrResponse(..), attachPromptlyDynWith, constDyn, ffor, fmapMaybe,
71− performRequestsAsync)
63+ leftmost, performRequestsAsync,
72------------------------------------------------------------------------------
65------------------------------------------------------------------------------
73import Servant.Common.BaseUrl (BaseUrl(..), Scheme(..), baseUrlWidget,
66import Servant.Common.BaseUrl (BaseUrl(..), Scheme(..), baseUrlWidget,
74 showBaseUrl,
67 showBaseUrl,
75 SupportsServantReflex)
68 SupportsServantReflex)
76−import Servant.Common.Req (ClientOptions(..),
77− defaultClientOptions,
78− Req, ReqResult(..), QParam(..),
69+import Servant.Common.Req (Req, ReqResult(..), QParam(..),
79 QueryPart(..), addHeader, authData,
70 QueryPart(..), addHeader, authData,
80 defReq, evalResponse, prependToPathParts,
71 defReq, evalResponse, prependToPathParts,
81 -- performRequestCT,
72 -- performRequestCT,
@@ -85,10 +76,9 @@ import Servant.Common.Req (ClientOptions(..),
85 performSomeRequestsAsync,
76 performSomeRequestsAsync,
86 qParamToQueryPart, reqBody,
77 qParamToQueryPart, reqBody,
87 reqSuccess, reqFailure,
78 reqSuccess, reqFailure,
88− reqMethod, respHeaders,
79+ reqMethod, respHeaders, response,
91− qParams, withCredentials)
81+ qParams)
94-- * Accessing APIs as a Client
84-- * Accessing APIs as a Client
@@ -103,75 +93,28 @@ import Servant.Common.Req (ClientOptions(..),
104-- > getAllBooks :: Event t l -> m (Event t (l, ReqResult [Book]))
94-- > getAllBooks :: Event t l -> m (Event t (l, ReqResult [Book]))
105-- > postNewBook :: Dynamic t (Maybe Book) -> Event t l
95-- > postNewBook :: Dynamic t (Maybe Book) -> Event t l
106−-- > -> m (Event t (l, ReqResult Book)))
96+-- -> m (Event t (l, ReqResult Book)))
107-- > (getAllBooks :<|> postNewBook) = client myApi host
97-- > (getAllBooks :<|> postNewBook) = client myApi host
108-- > where host = constDyn $ BaseUrl Http "localhost" 8080
98-- > where host = constDyn $ BaseUrl Http "localhost" 8080
110− :: (HasClient t m layout tag)
99+client :: (HasClient t m layout tag)
114− -> Dynamic t BaseUrl
115− -> Client t m layout tag
116−client p q t baseurl = clientWithRoute p q t defReq baseurl defaultClientOptions
119− :: (HasClient t m layout tag)
123− -> Dynamic t BaseUrl
125− -> Client t m layout tag
100+ => Proxy layout -> Proxy m -> Proxy tag -> Dynamic t BaseUrl -> Client t m layout tag
126−clientWithOpts p q t baseurl = clientWithRoute p q t defReq baseurl
101+client p q t baseurl = clientWithRoute p q t defReq baseurl
128−-- | Like 'clientWithOpts' but allows passing a function which will process the
129−-- result event in some way. This can be used to handle errors in a uniform way
130−-- across call sites.
131−clientWithOptsAndResultHandler
132− :: (HasClient t m layout tag)
136− -> Dynamic t BaseUrl
138− -> (forall a. Event t (ReqResult tag a) -> m (Event t (ReqResult tag a)))
139− -> Client t m layout tag
140−clientWithOptsAndResultHandler p q t = clientWithRouteAndResultHandler p q t defReq
143-- | This class lets us define how each API combinator
104-- | This class lets us define how each API combinator
144-- influences the creation of an HTTP request. It's mostly
105-- influences the creation of an HTTP request. It's mostly
145-- an internal class, you can just use 'client'.
106-- an internal class, you can just use 'client'.
146−class Monad m => HasClient t m layout (tag :: *) where
107+class HasClient t m layout (tag :: *) where
147 type Client t m layout tag :: *
108 type Client t m layout tag :: *
148− clientWithRoute
109+ clientWithRoute :: Proxy layout -> Proxy m -> Proxy tag -> Req t -> Dynamic t BaseUrl -> Client t m layout tag
153− -> Dynamic t BaseUrl
155− -> Client t m layout tag
156− clientWithRoute l m t r b o = clientWithRouteAndResultHandler l m t r b o return
158− clientWithRouteAndResultHandler
163− -> Dynamic t BaseUrl
165− -> (forall a. Event t (ReqResult tag a) -> m (Event t (ReqResult tag a)))
166− -> Client t m layout tag
169instance (HasClient t m a tag, HasClient t m b tag) => HasClient t m (a :<|> b) tag where
112instance (HasClient t m a tag, HasClient t m b tag) => HasClient t m (a :<|> b) tag where
170 type Client t m (a :<|> b) tag = Client t m a tag :<|> Client t m b tag
113 type Client t m (a :<|> b) tag = Client t m a tag :<|> Client t m b tag
172− clientWithRouteAndResultHandler Proxy q pTag req baseurl opts wrap =
115+ clientWithRoute Proxy q pTag req baseurl =
173− clientWithRouteAndResultHandler (Proxy :: Proxy a) q pTag req baseurl opts wrap :<|>
116+ clientWithRoute (Proxy :: Proxy a) q pTag req baseurl :<|>
174− clientWithRouteAndResultHandler (Proxy :: Proxy b) q pTag req baseurl opts wrap
117+ clientWithRoute (Proxy :: Proxy b) q pTag req baseurl
177-- Capture. Example:
120-- Capture. Example:
@@ -186,29 +129,32 @@ instance (HasClient t m a tag, HasClient t m b tag) => HasClient t m (a :<|> b)
186-- -> m (Event t (l, ReqResult Book))
129-- -> m (Event t (l, ReqResult Book))
187-- > getBook = client myApi (constDyn host)
130-- > getBook = client myApi (constDyn host)
189−instance (SupportsServantReflex t m, ToHttpApiData a, HasClient t m sublayout tag)
132+instance (SupportsServantReflex t m, FromJSON a, ToHttpApiData a, HasClient t m sublayout tag)
190 => HasClient t m (Capture capture a :> sublayout) tag where
133 => HasClient t m (Capture capture a :> sublayout) tag where
192 type Client t m (Capture capture a :> sublayout) tag =
135 type Client t m (Capture capture a :> sublayout) tag =
193 Dynamic t (Either Text a) -> Client t m sublayout tag
136 Dynamic t (Either Text a) -> Client t m sublayout tag
195− clientWithRouteAndResultHandler Proxy q t req baseurl opts wrap val =
138+ clientWithRoute Proxy q t req baseurl val =
196− clientWithRouteAndResultHandler
139+ clientWithRoute (Proxy :: Proxy sublayout)
197− (Proxy :: Proxy sublayout) q t (prependToPathParts p req) baseurl opts wrap
141+ (prependToPathParts p req)
198 where p = (fmap . fmap) (toUrlPiece) val
143 where p = (fmap . fmap) (toUrlPiece) val
201-- VERB (Returning content) --
146-- VERB (Returning content) --
202instance {-# OVERLAPPABLE #-}
147instance {-# OVERLAPPABLE #-}
203 -- Note [Non-Empty Content Types]
148 -- Note [Non-Empty Content Types]
204− (MimeUnrender ct a, ReflectMethod method, cts' ~ (ct ': cts), SupportsServantReflex t m
149+ (FromJSON a, MimeUnrender ct a, ReflectMethod method, cts' ~ (ct ': cts), SupportsServantReflex t m
205 ) => HasClient t m (Verb method status cts' a) tag where
150 ) => HasClient t m (Verb method status cts' a) tag where
206 type Client t m (Verb method status cts' a) tag =
151 type Client t m (Verb method status cts' a) tag =
207 Event t tag -> m (Event t (ReqResult tag a))
152 Event t tag -> m (Event t (ReqResult tag a))
208 -- TODO how to access input types here?
153 -- TODO how to access input types here?
209 -- ExceptT ServantError IO a
154 -- ExceptT ServantError IO a
210− clientWithRouteAndResultHandler Proxy _ _ req baseurl opts wrap trigs =
155+ clientWithRoute Proxy _ _ req baseurl trigs =
156+ -- performRequestCT (Proxy :: Proxy ct) method req' baseurl trigs
211− wrap =<< fmap runIdentity <$> performRequestsCT (Proxy :: Proxy ct) method (constDyn $ Identity $ req') baseurl opts trigs
157+ fmap runIdentity <$> performRequestsCT (Proxy :: Proxy ct) method (constDyn $ Identity $ req') baseurl trigs
212 where method = E.decodeUtf8 $ reflectMethod (Proxy :: Proxy method)
158 where method = E.decodeUtf8 $ reflectMethod (Proxy :: Proxy method)
213 req' = req { reqMethod = method }
159 req' = req { reqMethod = method }
@@ -221,33 +167,29 @@ instance {-# OVERLAPPING #-}
221 Event t tag -> m (Event t (ReqResult tag NoContent))
167 Event t tag -> m (Event t (ReqResult tag NoContent))
222 -- TODO: how to access input types here?
168 -- TODO: how to access input types here?
223 -- ExceptT ServantError IO NoContent
169 -- ExceptT ServantError IO NoContent
224− clientWithRouteAndResultHandler Proxy _ _ req baseurl opts wrap trigs =
170+ clientWithRoute Proxy _ _ req baseurl =
225− wrap =<< fmap runIdentity <$> performRequestsNoBody method (constDyn $ Identity req) baseurl opts trigs
171+ (fmap . fmap) runIdentity . performRequestsNoBody method (constDyn $ Identity req) baseurl
226 where method = E.decodeUtf8 $ reflectMethod (Proxy :: Proxy method)
172 where method = E.decodeUtf8 $ reflectMethod (Proxy :: Proxy method)
229toHeaders :: BuildHeadersTo ls => ReqResult tag a -> ReqResult tag (Headers ls a)
175toHeaders :: BuildHeadersTo ls => ReqResult tag a -> ReqResult tag (Headers ls a)
230toHeaders r =
176toHeaders r =
177+ let toBS = E.encodeUtf8
231− let hdrs = maybe []
178+ hdrs = maybe []
232− (\xhr -> fmap (\(h,v) -> (CI.map E.encodeUtf8 h, E.encodeUtf8 v))
179+ (\xhr -> fmap (\(h,v) -> (mk (toBS h), toBS v))
233 (Map.toList $ _xhrResponse_headers xhr))
180 (Map.toList $ _xhrResponse_headers xhr))
234 (response r)
181 (response r)
235 in ffor r $ \a -> Headers {getResponse = a ,getHeadersHList = buildHeadersTo hdrs}
182 in ffor r $ \a -> Headers {getResponse = a ,getHeadersHList = buildHeadersTo hdrs}
238class BuildHeaderKeysTo hs where
184class BuildHeaderKeysTo hs where
239− buildHeaderKeysTo :: Proxy hs -> [CI.CI T.Text]
185+ buildHeaderKeysTo :: Proxy hs -> [T.Text]
241instance {-# OVERLAPPABLE #-} BuildHeaderKeysTo '[]
187instance {-# OVERLAPPABLE #-} BuildHeaderKeysTo '[]
242 where buildHeaderKeysTo _ = []
188 where buildHeaderKeysTo _ = []
244instance {-# OVERLAPPABLE #-} (BuildHeaderKeysTo xs, KnownSymbol h)
190instance {-# OVERLAPPABLE #-} (BuildHeaderKeysTo xs, KnownSymbol h)
245 => BuildHeaderKeysTo ((Header h v) ': xs) where
191 => BuildHeaderKeysTo ((Header h v) ': xs) where
246− buildHeaderKeysTo _ =
248− thisKey = CI.mk $ T.pack (symbolVal (Proxy :: Proxy h))
249− in thisKey : buildHeaderKeysTo (Proxy :: Proxy xs)
192+ buildHeaderKeysTo _ = T.pack (symbolVal (Proxy :: Proxy h)) : buildHeaderKeysTo (Proxy :: Proxy xs)
252-- HEADERS Verb (Content) --
194-- HEADERS Verb (Content) --
253-- Headers combinator not treated in fully general case,
195-- Headers combinator not treated in fully general case,
@@ -257,15 +199,16 @@ instance {-# OVERLAPPABLE #-} (BuildHeaderKeysTo xs, KnownSymbol h)
257instance {-# OVERLAPPABLE #-}
199instance {-# OVERLAPPABLE #-}
258 -- Note [Non-Empty Content Types]
200 -- Note [Non-Empty Content Types]
259 ( MimeUnrender ct a, BuildHeadersTo ls, BuildHeaderKeysTo ls,
201 ( MimeUnrender ct a, BuildHeadersTo ls, BuildHeaderKeysTo ls,
260 ReflectMethod method, cts' ~ (ct ': cts),
203 ReflectMethod method, cts' ~ (ct ': cts),
261 SupportsServantReflex t m
204 SupportsServantReflex t m
262 ) => HasClient t m (Verb method status cts' (Headers ls a)) tag where
205 ) => HasClient t m (Verb method status cts' (Headers ls a)) tag where
263 type Client t m (Verb method status cts' (Headers ls a)) tag =
206 type Client t m (Verb method status cts' (Headers ls a)) tag =
264 Event t tag -> m (Event t (ReqResult tag (Headers ls a)))
207 Event t tag -> m (Event t (ReqResult tag (Headers ls a)))
265− clientWithRouteAndResultHandler Proxy _ _ req baseurl opts wrap trigs = do
208+ clientWithRoute Proxy _ _ req baseurl trigs = do
266 let method = E.decodeUtf8 $ reflectMethod (Proxy :: Proxy method)
209 let method = E.decodeUtf8 $ reflectMethod (Proxy :: Proxy method)
267− resp <- fmap runIdentity <$> performRequestsCT (Proxy :: Proxy ct) method (constDyn $ Identity req') baseurl opts trigs
210+ resp <- fmap runIdentity <$> performRequestsCT (Proxy :: Proxy ct) method (constDyn $ Identity req') baseurl trigs
268− wrap $ toHeaders <$> resp
211+ return $ toHeaders <$> resp
269 where req' = req { respHeaders =
212 where req' = req { respHeaders =
270 OnlyHeaders (Set.fromList (buildHeaderKeysTo (Proxy :: Proxy ls)))
213 OnlyHeaders (Set.fromList (buildHeaderKeysTo (Proxy :: Proxy ls)))
@@ -278,10 +221,10 @@ instance {-# OVERLAPPABLE #-}
278 ) => HasClient t m (Verb method status cts (Headers ls NoContent)) tag where
221 ) => HasClient t m (Verb method status cts (Headers ls NoContent)) tag where
279 type Client t m (Verb method status cts (Headers ls NoContent)) tag
222 type Client t m (Verb method status cts (Headers ls NoContent)) tag
280 = Event t tag -> m (Event t (ReqResult tag (Headers ls NoContent)))
223 = Event t tag -> m (Event t (ReqResult tag (Headers ls NoContent)))
281− clientWithRouteAndResultHandler Proxy _ _ req baseurl opts wrap trigs = do
224+ clientWithRoute Proxy _ _ req baseurl trigs = do
282 let method = E.decodeUtf8 $ reflectMethod (Proxy :: Proxy method)
225 let method = E.decodeUtf8 $ reflectMethod (Proxy :: Proxy method)
283− resp <- fmap runIdentity <$> performRequestsNoBody method (constDyn $ Identity req') baseurl opts trigs
226+ resp <- fmap runIdentity <$> performRequestsNoBody method (constDyn $ Identity req') baseurl trigs
284− wrap $ toHeaders <$> resp
227+ return $ toHeaders <$> resp
285 where req' = req {respHeaders =
228 where req' = req {respHeaders =
286 OnlyHeaders (Set.fromList (buildHeaderKeysTo (Proxy :: Proxy ls)))
229 OnlyHeaders (Set.fromList (buildHeaderKeysTo (Proxy :: Proxy ls)))
@@ -308,11 +251,11 @@ instance (KnownSymbol sym, ToHttpApiData a,
308 type Client t m (Header sym a :> sublayout) tag =
251 type Client t m (Header sym a :> sublayout) tag =
309 Dynamic t (Either Text a) -> Client t m sublayout tag
252 Dynamic t (Either Text a) -> Client t m sublayout tag
311− clientWithRouteAndResultHandler Proxy q t req baseurl opts wrap eVal =
254+ clientWithRoute Proxy q t req baseurl eVal =
312− clientWithRouteAndResultHandler
313− (Proxy :: Proxy sublayout) q t
255+ clientWithRoute (Proxy :: Proxy sublayout)
314− (Servant.Common.Req.addHeader hname eVal req)
257+ (Servant.Common.Req.addHeader hname eVal req)
315− baseurl opts wrap
258+ baseurl
316 where hname = T.pack $ symbolVal (Proxy :: Proxy sym)
259 where hname = T.pack $ symbolVal (Proxy :: Proxy sym)
@@ -326,21 +269,8 @@ instance HasClient t m sublayout tag
326 type Client t m (HttpVersion :> sublayout) tag =
269 type Client t m (HttpVersion :> sublayout) tag =
327 Client t m sublayout tag
270 Client t m sublayout tag
329− clientWithRouteAndResultHandler Proxy =
272+ clientWithRoute Proxy q t =
330− clientWithRouteAndResultHandler (Proxy :: Proxy sublayout)
273+ clientWithRoute (Proxy :: Proxy sublayout) q t
332−-- | Using a 'Summary' combinator in your API doesn't affect the client
334−instance (HasClient t m sublayout tag, KnownSymbol sym)
335− => HasClient t m (Summary sym :> sublayout) tag where
337− type Client t m (Summary sym :> sublayout) tag =
338− Client t m sublayout tag
340− clientWithRouteAndResultHandler Proxy =
341− clientWithRouteAndResultHandler (Proxy :: Proxy sublayout)
346-- | If you use a 'QueryParam' in one of your endpoints in your API,
276-- | If you use a 'QueryParam' in one of your endpoints in your API,
@@ -376,9 +306,9 @@ instance (KnownSymbol sym, ToHttpApiData a, HasClient t m sublayout tag, Reflex
376 Dynamic t (QParam a) -> Client t m sublayout tag
306 Dynamic t (QParam a) -> Client t m sublayout tag
378 -- if mparam = Nothing, we don't add it to the query string
308 -- if mparam = Nothing, we don't add it to the query string
379− clientWithRouteAndResultHandler Proxy q t req baseurl opts wrap mparam =
309+ clientWithRoute Proxy q t req baseurl mparam =
380− clientWithRouteAndResultHandler (Proxy :: Proxy sublayout) q t
310+ clientWithRoute (Proxy :: Proxy sublayout) q t
381− (req {qParams = paramPair : qParams req}) baseurl opts wrap
311+ (req {qParams = paramPair : qParams req}) baseurl
383 where pname = symbolVal (Proxy :: Proxy sym)
313 where pname = symbolVal (Proxy :: Proxy sym)
384 --p prm = QueryPartParam $ (fmap . fmap) (toQueryParam) prm
314 --p prm = QueryPartParam $ (fmap . fmap) (toQueryParam) prm
@@ -422,8 +352,8 @@ instance (KnownSymbol sym, ToHttpApiData a, HasClient t m sublayout tag, Reflex
422 type Client t m (QueryParams sym a :> sublayout) tag =
352 type Client t m (QueryParams sym a :> sublayout) tag =
423 Dynamic t [a] -> Client t m sublayout tag
353 Dynamic t [a] -> Client t m sublayout tag
425− clientWithRouteAndResultHandler Proxy q t req baseurl opts wrap paramlist =
355+ clientWithRoute Proxy q t req baseurl paramlist =
426− clientWithRouteAndResultHandler (Proxy :: Proxy sublayout) q t req' baseurl opts wrap
356+ clientWithRoute (Proxy :: Proxy sublayout) q t req' baseurl
428 where req' = req { qParams = (T.pack pname, params') : qParams req }
358 where req' = req { qParams = (T.pack pname, params') : qParams req }
429 pname = symbolVal (Proxy :: Proxy sym)
359 pname = symbolVal (Proxy :: Proxy sym)
@@ -462,8 +392,8 @@ instance (KnownSymbol sym, HasClient t m sublayout tag, Reflex t)
462 type Client t m (QueryFlag sym :> sublayout) tag =
392 type Client t m (QueryFlag sym :> sublayout) tag =
463 Dynamic t Bool -> Client t m sublayout tag
393 Dynamic t Bool -> Client t m sublayout tag
465− clientWithRouteAndResultHandler Proxy q t req baseurl opts wrap flag =
395+ clientWithRoute Proxy q t req baseurl flag =
466− clientWithRouteAndResultHandler (Proxy :: Proxy sublayout) q t req' baseurl opts wrap
396+ clientWithRoute (Proxy :: Proxy sublayout) q t req' baseurl
468 where req' = req { qParams = thisPair : qParams req }
398 where req' = req { qParams = thisPair : qParams req }
469 thisPair = (T.pack pName, QueryPartFlag flag) :: (Text, QueryPart t)
399 thisPair = (T.pack pName, QueryPartFlag flag) :: (Text, QueryPart t)
@@ -477,7 +407,7 @@ instance SupportsServantReflex t m => HasClient t m Raw tag where
477 -> Event t tag
407 -> Event t tag
478 -> m (Event t (ReqResult tag ()))
408 -> m (Event t (ReqResult tag ()))
480− clientWithRouteAndResultHandler _ _ _ _ baseurl _ wrap xhrs triggers = do
410+ clientWithRoute _ _ _ _ baseurl xhrs triggers = do
482 let xhrs' = liftA2 (\x path -> case x of
412 let xhrs' = liftA2 (\x path -> case x of
483 Left e -> Left e
413 Left e -> Left e
@@ -488,7 +418,7 @@ instance SupportsServantReflex t m => HasClient t m Raw tag where
488 okReq = fmapMaybe (\(t,x) -> either (const Nothing) (Just . (t,)) x) xhrs'' :: Event t (tag, XhrRequest ())
418 okReq = fmapMaybe (\(t,x) -> either (const Nothing) (Just . (t,)) x) xhrs'' :: Event t (tag, XhrRequest ())
490 resps <- performRequestsAsync okReq
420 resps <- performRequestsAsync okReq
491− wrap $ leftmost [ uncurry RequestFailure <$> badReq
421+ return $ leftmost [ uncurry RequestFailure <$> badReq
492 , evalResponse (const $ Right ()) <$> resps
422 , evalResponse (const $ Right ()) <$> resps
@@ -519,8 +449,8 @@ instance (MimeRender ct a, HasClient t m sublayout tag, Reflex t)
519 type Client t m (ReqBody (ct ': cts) a :> sublayout) tag =
449 type Client t m (ReqBody (ct ': cts) a :> sublayout) tag =
520 Dynamic t (Either Text a) -> Client t m sublayout tag
450 Dynamic t (Either Text a) -> Client t m sublayout tag
522− clientWithRouteAndResultHandler Proxy q t req baseurl opts wrap body =
452+ clientWithRoute Proxy q t req baseurl body =
523− clientWithRouteAndResultHandler (Proxy :: Proxy sublayout) q t req' baseurl opts wrap
453+ clientWithRoute (Proxy :: Proxy sublayout) q t req' baseurl
524 where req' = req { reqBody = bodyBytesCT }
454 where req' = req { reqBody = bodyBytesCT }
525 ctProxy = Proxy :: Proxy ct
455 ctProxy = Proxy :: Proxy ct
526 ctString = T.pack $ show $ contentType ctProxy
456 ctString = T.pack $ show $ contentType ctProxy
@@ -534,9 +464,9 @@ instance (MimeRender ct a, HasClient t m sublayout tag, Reflex t)
534instance (KnownSymbol path, HasClient t m sublayout tag, Reflex t) => HasClient t m (path :> sublayout) tag where
464instance (KnownSymbol path, HasClient t m sublayout tag, Reflex t) => HasClient t m (path :> sublayout) tag where
535 type Client t m (path :> sublayout) tag = Client t m sublayout tag
465 type Client t m (path :> sublayout) tag = Client t m sublayout tag
537− clientWithRouteAndResultHandler Proxy q t req baseurl opts wrap =
467+ clientWithRoute Proxy q t req baseurl =
538− clientWithRouteAndResultHandler (Proxy :: Proxy sublayout) q t
468+ clientWithRoute (Proxy :: Proxy sublayout) q t
539− (prependToPathParts (pure (Right $ T.pack p)) req) baseurl opts wrap
469+ (prependToPathParts (pure (Right $ T.pack p)) req) baseurl
541 where p = symbolVal (Proxy :: Proxy path)
471 where p = symbolVal (Proxy :: Proxy path)
@@ -544,23 +474,23 @@ instance (KnownSymbol path, HasClient t m sublayout tag, Reflex t) => HasClient
544instance HasClient t m api tag => HasClient t m (Vault :> api) tag where
474instance HasClient t m api tag => HasClient t m (Vault :> api) tag where
545 type Client t m (Vault :> api) tag = Client t m api tag
475 type Client t m (Vault :> api) tag = Client t m api tag
547− clientWithRouteAndResultHandler Proxy =
477+ clientWithRoute Proxy q t req baseurl =
548− clientWithRouteAndResultHandler (Proxy :: Proxy api)
478+ clientWithRoute (Proxy :: Proxy api) q t req baseurl
551instance HasClient t m api tag => HasClient t m (RemoteHost :> api) tag where
481instance HasClient t m api tag => HasClient t m (RemoteHost :> api) tag where
552 type Client t m (RemoteHost :> api) tag = Client t m api tag
482 type Client t m (RemoteHost :> api) tag = Client t m api tag
554− clientWithRouteAndResultHandler Proxy =
484+ clientWithRoute Proxy q t req baseurl =
555− clientWithRouteAndResultHandler (Proxy :: Proxy api)
485+ clientWithRoute (Proxy :: Proxy api) q t req baseurl
559instance HasClient t m api tag => HasClient t m (IsSecure :> api) tag where
489instance HasClient t m api tag => HasClient t m (IsSecure :> api) tag where
560 type Client t m (IsSecure :> api) tag = Client t m api tag
490 type Client t m (IsSecure :> api) tag = Client t m api tag
562− clientWithRouteAndResultHandler Proxy =
492+ clientWithRoute Proxy q t req baseurl =
563− clientWithRouteAndResultHandler (Proxy :: Proxy api)
493+ clientWithRoute (Proxy :: Proxy api) q t req baseurl
566instance (HasClient t m api tag, Reflex t)
496instance (HasClient t m api tag, Reflex t)
@@ -569,8 +499,8 @@ instance (HasClient t m api tag, Reflex t)
569 type Client t m (BasicAuth realm usr :> api) tag = Dynamic t (Maybe BasicAuthData)
499 type Client t m (BasicAuth realm usr :> api) tag = Dynamic t (Maybe BasicAuthData)
570 -> Client t m api tag
500 -> Client t m api tag
572− clientWithRouteAndResultHandler Proxy q t req baseurl opts wrap authdata =
502+ clientWithRoute Proxy q t req baseurl authdata =
573− clientWithRouteAndResultHandler (Proxy :: Proxy api) q t req' baseurl opts wrap
503+ clientWithRoute (Proxy :: Proxy api) q t req' baseurl
575 req' = req { authData = Just authdata }
505 req' = req { authData = Just authdata }
@@ -596,30 +526,3 @@ non-empty lists, but is otherwise more specific, no instance will be overall
596more specific. This in turn generally means adding yet another instance (one
526more specific. This in turn generally means adding yet another instance (one
597for empty and one for non-empty lists).
527for empty and one for non-empty lists).
601−-- SUPPORT FOR servant-auth --
603−-- For JavaScript clients we should be sending/storing JSON web tokens in a
604−-- way that is inaccessible to JavaScript.
606−-- For @servant-auth@ this is done with HTTP-only cookies. In a Reflex-DOM
607−-- app this means the @servant-auth@ client should only verify that the API
608−-- supports Cookie-based authentication but do nothing with the token
611−-- @HasCookieAuth auths@ is nominally a redundant constraint, but ensures
612−-- we're not trying to rely on cookies when the API does not use them.
613−instance (HasCookieAuth auths, HasClient t m api tag) => HasClient t m (Auth.Auth auths a :> api) tag where
615− type Client t m (Auth.Auth auths a :> api) tag = Client t m api tag
616− clientWithRouteAndResultHandler Proxy = clientWithRouteAndResultHandler (Proxy :: Proxy api)
619−type family HasCookieAuth xs :: Constraint where
620− HasCookieAuth (Auth.Cookie ': xs) = ()
621− HasCookieAuth (x ': xs) = HasCookieAuth xs
622− HasCookieAuth '[] = CookieAuthNotEnabled
624−class CookieAuthNotEnabled