1 | module Stellar.HTTP.Async
4 | import TyTTP.Adapter.Node.HTTP
8 | import Control.Monad.Continuation
14 | JSPublisher : Type -> Type
15 | JSPublisher = Publisher IO Error
19 | JSCont : Type -> Type
20 | JSCont = ContT () IO
24 | toCont : Applicative m =>
25 | (handleErrors : e -> m ()) ->
26 | Publisher m e a -> ContT () m a
27 | toCont err (MkPublisher sub) = MkContT $
\cb =>
28 | sub $
MkSubscriber { onNext = cb
34 | jsToCont : JSPublisher a -> JSCont a
35 | jsToCont = toCont (\err => putStrLn err.message)
39 | asyncifyRequest : RawHttpRequest -> JSPublisher (HttpRequest String (List (String, String)) Buffer)
41 | (MkRequest method url version headers (MkPublisher body))
42 | = MkPublisher $
\sub => do
43 | buffers : IORef (List Buffer) <- newIORef []
45 | { onNext = \bodyValue => do
46 | modifyIORef buffers (bodyValue ::)
47 | , onSucceded = \_ => do
48 | Just b <- concatBuffers !(readIORef buffers)
49 | | Nothing => putStrLn "failed to collect buffers"
50 | let req = MkRequest method url version headers b
54 | => putStrLn "something went wrong"
60 | asyncify : RawHttpRequest -> JSCont (HttpRequest String (List (String, String)) Buffer)
61 | asyncify = jsToCont . asyncifyRequest