Skip to content

Commit ab7f6ce

Browse files
committed
Upgrade to purescript-aff v4
1 parent 822c4ba commit ab7f6ce

File tree

3 files changed

+45
-31
lines changed

3 files changed

+45
-31
lines changed

bower.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,20 @@
2323
"purescript-transformers": "^3.2.0",
2424
"purescript-node-http": "^4.0.0",
2525
"purescript-media-types": "^3.0.0",
26-
"purescript-node-fs-aff": "^4.0.0",
26+
"purescript-node-fs-aff": "^5.0.0",
2727
"purescript-generics-rep": "^5.0.0",
2828
"purescript-proxy": "^2.0.0",
2929
"purescript-argonaut": "^3.0.0",
3030
"purescript-arrays": "^4.0.1",
3131
"purescript-argonaut-codecs": "^3.0.0",
3232
"purescript-http-methods": "^3.0.0",
33-
"purescript-indexed-monad": "^0.2.0",
33+
"purescript-indexed-monad": "^0.3.0",
3434
"purescript-smolder": "^7.0.0",
35-
"purescript-aff": "^3.1.0"
35+
"purescript-aff": "^4.0.0"
3636
},
3737
"devDependencies": {
3838
"purescript-psci-support": "^3.0.0",
39-
"purescript-spec": "^0.13.0",
40-
"purescript-spec-discovery": "^0.5.0"
39+
"purescript-spec": "^2.0.0",
40+
"purescript-spec-discovery": "^2.0.0"
4141
}
4242
}

src/Hyper/Node/Server.purs

Lines changed: 33 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,37 +10,38 @@ module Hyper.Node.Server
1010
) where
1111

1212
import Prelude
13-
import Data.HTTP.Method as Method
14-
import Data.Int as Int
15-
import Data.StrMap as StrMap
16-
import Node.Buffer as Buffer
17-
import Node.HTTP as HTTP
18-
import Node.Stream as Stream
13+
1914
import Control.IxMonad (ipure, (:*>), (:>>=))
20-
import Control.Monad.Aff (Aff, launchAff, makeAff, runAff)
21-
import Control.Monad.Aff.AVar (putVar, takeVar, modifyVar, makeVar', AVAR, makeVar)
15+
import Control.Monad.Aff (Aff, launchAff, launchAff_, makeAff, nonCanceler, runAff_)
16+
import Control.Monad.Aff.AVar (AVAR, makeEmptyVar, makeVar, putVar, takeVar)
2217
import Control.Monad.Aff.Class (class MonadAff, liftAff)
2318
import Control.Monad.Eff (Eff)
2419
import Control.Monad.Eff.Class (class MonadEff, liftEff)
2520
import Control.Monad.Eff.Exception (EXCEPTION, catchException, error)
2621
import Control.Monad.Error.Class (throwError)
2722
import Data.Either (Either(..), either)
23+
import Data.HTTP.Method as Method
24+
import Data.Int as Int
2825
import Data.Lazy (defer)
2926
import Data.Maybe (Maybe(..))
3027
import Data.Newtype (unwrap)
28+
import Data.StrMap as StrMap
3129
import Data.Tuple (Tuple(..))
3230
import Hyper.Conn (Conn)
3331
import Hyper.Middleware (Middleware, evalMiddleware, lift')
3432
import Hyper.Middleware.Class (getConn, modifyConn)
35-
import Hyper.Node.Server.Options as Hyper.Node.Server.Options
3633
import Hyper.Node.Server.Options (Options)
34+
import Hyper.Node.Server.Options as Hyper.Node.Server.Options
3735
import Hyper.Request (class ReadableBody, class Request, class StreamableBody, RequestData, parseUrl, readBody)
3836
import Hyper.Response (class ResponseWritable, class Response, ResponseEnded, StatusLineOpen)
3937
import Hyper.Status (Status(..))
4038
import Node.Buffer (BUFFER, Buffer)
39+
import Node.Buffer as Buffer
4140
import Node.Encoding (Encoding(..))
4241
import Node.HTTP (HTTP)
42+
import Node.HTTP as HTTP
4343
import Node.Stream (Stream, Writable)
44+
import Node.Stream as Stream
4445

4546

4647
data HttpRequest
@@ -62,15 +63,17 @@ newtype NodeResponse m e
6263
writeString :: forall m e. MonadAff e m => Encoding -> String -> NodeResponse m e
6364
writeString enc str = NodeResponse $ \w -> liftAff (makeAff (writeAsAff w))
6465
where
65-
writeAsAff w fail succeed =
66-
Stream.writeString w enc str (succeed unit) >>=
66+
writeAsAff w k = do
67+
Stream.writeString w enc str (k (pure unit)) >>=
6768
if _
68-
then succeed unit
69-
else fail (error "Failed to write string to response")
69+
then k (pure unit)
70+
else k (throwError (error "Failed to write string to response"))
71+
pure nonCanceler
7072

7173
write :: forall m e. MonadAff e m => Buffer -> NodeResponse m e
7274
write buffer = NodeResponse $ \w ->
73-
liftAff (makeAff (\fail succeed -> void $ Stream.write w buffer (succeed unit)))
75+
liftAff (makeAff (\k -> Stream.write w buffer (k (pure unit))
76+
*> pure nonCanceler))
7477

7578
instance stringNodeResponse :: (MonadAff e m) => ResponseWritable (NodeResponse m e) m String where
7679
toResponse = ipure <<< writeString UTF8
@@ -92,8 +95,8 @@ readBodyAsBuffer
9295
-> Aff (http :: HTTP, avar :: AVAR, buffer :: BUFFER | e) Buffer
9396
readBodyAsBuffer (HttpRequest request _) = do
9497
let stream = HTTP.requestAsStream request
95-
bodyResult <- makeVar
96-
chunks <- makeVar' []
98+
bodyResult <- makeEmptyVar
99+
chunks <- makeVar []
97100
fillResult <- liftEff $
98101
catchException (pure <<< Left) (Right <$> fillBody stream chunks bodyResult)
99102
-- Await the body, or an error.
@@ -104,16 +107,19 @@ readBodyAsBuffer (HttpRequest request _) = do
104107
fillBody stream chunks bodyResult = do
105108
-- Append all chunks to the body buffer.
106109
Stream.onData stream \chunk ->
107-
void (launchAff (modifyVar (_ <> [chunk]) chunks))
110+
let modification = do
111+
v <- takeVar chunks
112+
putVar (v <> [chunk]) chunks
113+
in void (launchAff modification)
108114
-- Complete with `Left` on error.
109115
Stream.onError stream $
110-
void <<< launchAff <<< putVar bodyResult <<< Left
116+
launchAff_ <<< flip putVar bodyResult <<< Left
111117
-- Complete with `Right` on successful "end" event.
112118
Stream.onEnd stream $ void $ launchAff $
113119
takeVar chunks
114120
>>= concat'
115121
>>= (pure <<< Right)
116-
>>= putVar bodyResult
122+
>>= flip putVar bodyResult
117123
concat' = liftEff <<< Buffer.concat
118124

119125
instance readableBodyHttpRequestString :: (Monad m, MonadAff (http :: HTTP, avar :: AVAR, buffer :: BUFFER | e) m)
@@ -250,7 +256,14 @@ runServer' options components runM middleware = do
250256
, response: HttpResponse response
251257
, components: components
252258
}
253-
in conn # evalMiddleware middleware # runM # runAff options.onRequestError (const $ pure unit) # void
259+
callback =
260+
case _ of
261+
Left err -> options.onRequestError err
262+
Right _ -> pure unit
263+
in conn
264+
# evalMiddleware middleware
265+
# runM
266+
# runAff_ callback
254267

255268
runServer
256269
:: forall e c c'.

src/Hyper/Node/Session/InMemory.purs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
module Hyper.Node.Session.InMemory where
22

33
import Prelude
4-
import Data.Map as Map
4+
55
import Control.Monad.Aff (Aff)
6-
import Control.Monad.Aff.AVar (AVAR, AVar, makeVar', modifyVar, peekVar)
6+
import Control.Monad.Aff.AVar (AVAR, AVar, makeVar, putVar, readVar)
77
import Control.Monad.Aff.Class (class MonadAff, liftAff)
88
import Control.Monad.Aff.Console (CONSOLE, log)
99
import Data.Map (Map)
10+
import Data.Map as Map
1011
import Data.Newtype (unwrap)
1112
import Hyper.Session (class SessionStore, SessionID(..))
1213

@@ -25,19 +26,19 @@ instance sessionStoreInMemorySessionStore :: ( Monad m
2526
get (InMemorySessionStore var) id =
2627
liftAff do
2728
log ("Looking up session: " <> show (unwrap id))
28-
Map.lookup id <$> peekVar var
29+
Map.lookup id <$> readVar var
2930

3031
put (InMemorySessionStore var) id session = do
3132
liftAff do
3233
log ("Saving session: " <> unwrap id)
33-
modifyVar (Map.insert id session) var
34+
Map.insert id session <$> readVar var >>= flip putVar var
3435

3536
delete (InMemorySessionStore var) id = do
3637
liftAff do
3738
log ("Deleting session: " <> unwrap id)
38-
modifyVar (Map.delete id) var
39+
Map.delete id <$> readVar var >>= flip putVar var
3940

4041
newInMemorySessionStore
4142
:: forall e session
4243
. Aff ( avar AVAR | e ) (InMemorySessionStore session)
43-
newInMemorySessionStore = InMemorySessionStore <$> makeVar' Map.empty
44+
newInMemorySessionStore = InMemorySessionStore <$> makeVar Map.empty

0 commit comments

Comments
 (0)